【问题标题】:Call something based on UITableView rows selected, in an IBAction在 IBAction 中根据选择的 UITableView 行调用某些内容
【发布时间】:2016-09-28 22:45:46
【问题描述】:

我刚刚看到一篇关于选择多个 UITableView 行的帖子,并根据选择的行/行,当您按下链接到 IBAction 的按钮时会发生一些事情。

这是一个有趣的问题,我已经玩过了,但现在我有点卡住了。

如您所见,我有一个名为 selectedIndexes 的 NSMutableArray,所选行/行使用 NSLog 显示在控制台中。这工作正常:

- (IBAction)doSomethingWithSelectedRows:(id)sender {

for (NSNumber *data in self.selectedIndexes) {
    NSLog(@"Row %ld is selected.", (long)[data integerValue] +1);
}

if (WHAT SHOULD BE PUT HERE?) {      
}
//Do whatever you want here.
}

问题是,如果您希望发生这种情况,应该在上面的 if 语句中添加什么:

if (row 2 and row 1 are selected {

//Run this code.

}

更新:

这里有更多代码

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

UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];

if ([selectedCell accessoryType] == UITableViewCellAccessoryNone) {

    [selectedCell setAccessoryType:UITableViewCellAccessoryCheckmark];
    [_selectedIndexes addObject:[NSNumber numberWithInteger:indexPath.row]];

} else {

    [selectedCell setAccessoryType:UITableViewCellAccessoryNone];
    [_selectedIndexes removeObject:[NSNumber numberWithInteger:indexPath.row]];

}

[tableView deselectRowAtIndexPath:indexPath animated:YES];

}

- (IBAction)doSomethingWithRowsSelected:(id)sender {

for (NSNumber *data in self.selectedIndexes) {
    NSLog(@"Row %ld is selected.", (long)[data integerValue] +1);

}

}

【问题讨论】:

  • 建议您使用NSMutableIndexSet,而不是将选择存储在数组中,然后检查您感兴趣的两个索引是否被选中
  • 我有什么办法吗?
  • @Paulw11 添加了更多代码!

标签: ios objective-c uitableview


【解决方案1】:

虽然您可以使用数组,但 NSMutableIndexSet 对于此任务来说是一个更好的数据结构。它允许您检查给定索引是否在集合中,而无需遍历所有对象。

@property (strong,nonatomic) NSMutableIndexSet *selectedRows;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSUInteger row = indexPath.row;
    UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];

    if ([self.selectedRows containsIndex:row]) {
        [self.selectedRows removeIndex:row];
        [selectedCell setAccessoryType:UITableViewCellAccessoryNone];
    } else {
        [self.selectedRows addIndex:indexPath.row];
        [selectedCell setAccessoryType:UITableViewCellAccessoryCheckmark];      
    }
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

现在您可以轻松检查是否选择了任何两行:​​

- (IBAction)doSomethingWithRowsSelected:(id)sender {
    if ([self.selectedRows containsIndex:1] && [self.selectedRows containsIndex:2]) {
        // Do whatever
    }
}

另外,不要忘记根据[self.selectedRows containsIndex:indexPath.row]cellForRowAtIndexPath中设置配件类型,否则滚动时你的复选标记会出错。

【讨论】:

  • 我没有显示它,但你需要说self.selectedRows = [NSMutableIndexSet new]; viewDidLoad 之类的地方
  • 抱歉,知道了。谢谢你的回答!
【解决方案2】:

这就是我要做的,

1、使用indexPathsForSelectedRows获取选中行的数组,

第二,迭代数组以检查 indexPath.row 是 1 还是 2。

第三,如果你的 if 语句的条件为真,那么做...

【讨论】:

  • 我有什么办法吗?
  • @спасибо,您认为可以将 NSIndexPath 保存在您的_selectedIndexes 中吗?这会很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多