0
#pragma mark -
#pragma mark Table Data Source Methods
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [self.list count];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *checkMarkCellIdentifier =  @"CheckMarkCellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:checkMarkCellIdentifier];
    if(cell == nil)
    {
        cell    =   [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:checkMarkCellIdentifier];
    }
      NSUInteger row = [indexPath row];
      NSUInteger oldRow = [self.lastIndexPath row];
     cell.textLabel.text = [self.list objectAtIndex:row];
    cell.accessoryType = (row == oldRow && self.lastIndexPath != nil) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
    return cell;

}


#pragma Mark -
#pragma Mark  Table Delegate Methods



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     self.tickList = [[NSMutableArray alloc]init];
    int newRow = [indexPath row];
    UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];
    if(newCell.accessoryType == UITableViewCellAccessoryCheckmark)
    {
        self.lastIndexPath = indexPath;
    }
    int oldRow = (self.lastIndexPath != nil) ? [self.lastIndexPath row] : -1;

    if(newRow == oldRow)
    {
         UITableViewCell *oldCell = [tableView cellForRowAtIndexPath:self.lastIndexPath];
       if(oldCell.accessoryType == UITableViewCellAccessoryCheckmark)
       {
           oldCell.accessoryType = UITableViewCellAccessoryNone;
           self.lastIndexPath = nil;
           [self.tickList removeObject:indexPath];

       }
       else{
           oldCell.accessoryType = UITableViewCellAccessoryCheckmark;
           self.lastIndexPath = indexPath;
           [self.tickList addObject:self.lastIndexPath];

       }

    }

    else if (newRow != oldRow) {
        UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];
        newCell.accessoryType = UITableViewCellAccessoryCheckmark;
        UITableViewCell *oldCell = [tableView cellForRowAtIndexPath:self.lastIndexPath];
        oldCell.accessoryType = UITableViewCellAccessoryCheckmark;
        self.lastIndexPath = indexPath;
        [self.tickList addObject:self.lastIndexPath];
    }

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

}

上記のコードから、この行 [self.tickList addObject:self.lastIndexPath] を使用して、選択したセルを tickList という名前の可変配列に格納するために毎回使用し、削除するために removeObject を使用しましたが、うまくいきません。私はそのためにエラーが発生しています

2013-07-26 11:06:30.339 NAV[762:c07] Application windows are expected to have a root view controller at the end of application launch
2013-07-26 11:06:32.117 NAV[762:c07] -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x80343a0
2013-07-26 11:06:32.118 NAV[762:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x80343a0'
*** First throw call stack:
(0x1c9d012 0x10dae7e 0x1d284bd 0x1c8cbbc 0x1c8c94e 0x5a3c 0xce285 0xce4ed 0xad85b3 0x1c5c376 0x1c5be06 0x1c43a82 0x1c42f44 0x1c42e1b 0x1bf77e3 0x1bf7668 0x1effc 0x264d 0x2575)
libc++abi.dylib: terminate called throwing an exception
4

3 に答える 3

2

この行を指している NSArray にオブジェクトを挿入しようとしているため、このエラーが発生しています。

-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x80343a0

addObject は NSMutableArray ではなく NSArray のメソッドではありません

NSMutableArrayNSArray は常に実行時ではなくコンパイル時にアイテムで初期化されるため、実行時にいくつかのアイテムを追加または削除するように配列を作成してください。

お役に立てれば。

于 2013-07-26T05:48:38.613 に答える
2

上記のコードの代替方法は、私が以下に提供しているものです。最初は複雑であることがわかりましたが、今では非常に単純です。上記のコードの代替コードは

#pragma mark -
#pragma mark Table Data Source Methods
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [self.list count];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *checkMarkCellIdentifier =  @"CheckMarkCellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:checkMarkCellIdentifier];
    if(cell == nil)
    {
        cell    =   [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:checkMarkCellIdentifier];
    }
      NSUInteger row = [indexPath row];
     // NSUInteger oldRow = [self.lastIndexPath row];
     cell.textLabel.text = [self.list objectAtIndex:row];
   for(id key in self.tickList)
{
   if( key == indexPath)
   {
       if(cell.accessoryType == UITableViewCellAccessoryCheckmark)
       {
           cell.accessoryType = UITableViewCellAccessoryNone;
        }
       else
       {
           cell.accessoryType = UITableViewCellAccessoryCheckmark;
        }

   }
}
    //cell.accessoryType = (row == oldRow && self.lastIndexPath != nil) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
    NSLog(@"%@",indexPath);
    return cell;

}


#pragma Mark -
#pragma Mark  Table Delegate Methods



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if(cell.accessoryType == UITableViewCellAccessoryCheckmark)
    {
            cell.accessoryType = UITableViewCellAccessoryNone;
        [self.tickList removeObject:indexPath];
    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        [self.tickList addObject:indexPath];
    }

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

}

ここでは、tableview Delegate メソッドのみを変更しました。ここでは、複数のティックを使用するため、2 つのセルを作成する必要はありません。

3行選択後 ここに画像の説明を入力

2 番目に選択した行の選択を解除した後

ここに画像の説明を入力

于 2013-07-26T06:27:37.453 に答える
0

indexpath を配列に格納して、セルのリロード時に使用することができます。インデックスパスを保存する必要があります

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {

    mycustomecell *cell = (mycustomecell *)[tableView cellForRowAtIndexPath:indexPath];
    if ([arrayOfSelectedIndex containsObject:indexPath]) 
            {

                [arrayOfSelectedIndex removeObject:indexPath];


                cell.imgView.image = [UIImage imageNamed:@"BG_Cell-Right_UnChacked.png"];
                cell.backgroundView.backgroundColor=[UIColor clearColor];


            }
            else
            {
                [arrayOfSelectedIndex addObject:indexPath];



                cell.imgView.image = [UIImage imageNamed:@"BG_Cell-Right_Chacked.png"];
                cell.backgroundView.backgroundColor=[UIColor clearColor];


            }
}
于 2013-07-26T13:24:48.663 に答える