Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 目标C-使用节的TableView复选框存在问题_Ios_Objective C_Uitableview - Fatal编程技术网

Ios 目标C-使用节的TableView复选框存在问题

Ios 目标C-使用节的TableView复选框存在问题,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我正在使用以下代码在UITableView中实现联系人复选框功能 我遇到的问题是,当勾选几个用户,然后上下滚动表格时,不应该勾选的用户显示为已勾选,反之亦然 我假设这与我的单元格创建中的错误有关,但我不太确定是什么原因 - (void)viewDidLoad { ... self.checkedUsers = [[NSMutableArray alloc] init]; for (int i=0; i<self.allContacts.count; i++)

我正在使用以下代码在UITableView中实现联系人复选框功能

我遇到的问题是,当勾选几个用户,然后上下滚动表格时,不应该勾选的用户显示为已勾选,反之亦然

我假设这与我的单元格创建中的错误有关,但我不太确定是什么原因

- (void)viewDidLoad {

    ...

    self.checkedUsers = [[NSMutableArray alloc] init];

    for (int i=0; i<self.allContacts.count; i++) {
        [self.checkedUsers insertObject:@"FALSE" atIndex:i];
    }

    ...
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

     static NSString *simpleTableIdentifier = @"SocietyContactCell";
     SocietyContactCell *cell = (SocietyContactCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

          if (cell == nil) {        
          NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SocietyContactCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
          }

     BOOL checked =  [[self.checkedUsers objectAtIndex:indexPath.row] boolValue];
     UIImage *image = (checked) ? [UIImage imageNamed:@"checkedContact.png"] : [UIImage imageNamed:@"uncheckedContact.png"];

     [cell.checkButton setBackgroundImage:image forState:UIControlStateNormal];
     [cell.checkButton addTarget:self action:@selector(buttonPressedAction:) forControlEvents:UIControlEventTouchUpInside];
}

- (void)buttonPressedAction:(id)sender
{
    UIButton *button = (UIButton *)sender;
    int row = button.tag;

    BOOL checked = [[self.checkedUsers objectAtIndex:row] boolValue];
    [self.checkedUsers removeObjectAtIndex:row];
    [self.checkedUsers insertObject:(checked) ? @"FALSE":@"TRUE" atIndex:row];

    UIImage *newImage = (checked) ? [UIImage imageNamed:@"uncheckedContact.png"] : [UIImage imageNamed:@"checkedContact.png"];
    [button setBackgroundImage:newImage forState:UIControlStateNormal];

}
编辑:我现在意识到这个问题可能来自我在这个TableView中使用的部分。联系人按字母顺序排列,这会弄乱我的标签


如何使用节来解决此问题

这里的问题是在单元格中保留复选标记的状态。由于表格单元格在滚动时重复使用,因此会再次调用cellForRowAtIndexPath方法,并且不会在其中再次设置复选标记的值

您必须创建一个全局数组,该数组将存储每个索引的复选标记状态。然后,您可以在cellForRowAtIndexPath方法中设置选中/未选中复选标记按钮的状态

将以下代码段与代码显示一起添加:

 [cell.checkButton addTarget:self action:@selector(buttonPressedAction:) forControlEvents:UIControlEventTouchUpInside];
 [cell.checkButton setTag:indexPath.row];
此外,更换这些管路:

[self.checkedUsers removeObjectAtIndex:row];
[self.checkedUsers insertObject:(checked) ? @"FALSE":@"TRUE" atIndex:row];
为此:

[self.checkedUsers replaceObjectAtIndex:row withObject:checked ? @"TRUE" : @"FALSE"];

我看不到您每次在cellForRowAtIndexPath:中设置button.tag的位置,因此该操作方法可能正在更新self.checkedUsers数组中的错误行,尽管该操作方法此时会独立地正确更新单元格的图像。但是,当您上下滚动时,显示屏将返回self.checkedUsers阵列中的状态

您可能需要这样一行代码:

cell.checkButton.tag = indexPath.row;
在您的cellForRowAtIndexPath:方法中

其次,您的操作方法是获取self.itsToDoChecked上的状态,然后更新self.checkedUsers数组,当它出现时,它应该在同一数组上执行操作,只需反转给定行索引的状态即可。不确定这是否只是一个示例代码输入错误或有意义的事情


编辑:单元格子类中也可能存在导致问题的状态;很难确定。您希望在该类中实现-prepareforeuse,并始终调用super将任何状态重置为初始值。

在SocietyContactCell类中添加以下方法:

- (void)prepareForReuse {
    [super prepareForReuse];
    [self.checkButton setBackgroundImage:nil forState:UIControlStateNormal];
}

你在哪里初始化itsToDoChecked数组?@ClausBönnhoff抱歉,我编辑了代码我很困惑…我在CellForRowatinex路径中的代码是否正确地检查了checkedUsers数组以确定checkmark的状态?我刚刚注销了标记,现在我意识到问题可能会出现,因为我正在使用分区…联系人按字母顺序排列。关于如何使用节来处理这个问题,有什么建议吗?添加标签似乎并不能解决问题……是的,这是一个打字错误。我已经编辑过,所以如果你在action方法中注销标记,它是否总是正确的?我刚刚注销了标记,我现在意识到问题很可能会出现,因为我使用的是分区…联系人按字母顺序排列。关于如何使用小节处理此问题,有什么建议吗?可能有几种方法。可以将整个nsindepath作为关联对象存储在按钮上。您可以遍历按钮的超级视图,直到找到UITableViewCell,然后使用UITableView的-indexPathForCell:方法获取索引路径。您可以将标记设为计算-标记==indexPath.section*1000+indexPath.row;然后在方法中,您可以得到section=tag/1000和row=tag%1000;这需要更改为一个数组数组,每个节一个顶级数组,子数组是该节中的所有行,并相应地更新访问。