以编程方式选择tableview行


Answers:


109

参考文档:

调用此方法不会导致委托接收到tableView:willSelectRowAtIndexPath:tableView:didSelectRowAtIndexPath:消息,也不会UITableViewSelectionDidChangeNotification向观察者发送通知。

我要做的是:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self doSomethingWithRowAtIndexPath:indexPath];
}

然后,从您要调用selectRowAtIndexPath的位置,而是调用doSomethingWithRowAtIndexPath。最重要的是,如果您希望发生UI反馈,还可以调用selectRowAtIndexPath。


4
或者,当您以编程方式选择行时,可以调用tableView:didSelectRowAtIndexPath:您自己(在已将其作为委托连接的类中)。
Kendall Helmstetter Gelner 2010年

3
在我看来,这种方法确实很不错,确实可以完成工作,但是我认为应该有更好的方法。
Tapan Thaker 2012年

1
我真的不认为您需要创建一个调用“ doSomethingWithRowAtIndexPath”,难道您不只是调用委托方法并传递从实现委托方法的地方执行didSelect逻辑所需的参数吗?
ImpactZero 2014年

111

就像Jaanus所说:

调用此(-selectRowAtIndexPath:animated:scrollPosition :)方法不会导致委托接收到tableView:willSelectRowAtIndexPath:或tableView:didSelectRowAtIndexPath:消息,也不会将UITableViewSelectionDidChangeNotification通知发送给观察者。

因此,您只需要自己调用该delegate方法即可。

例如:

Swift 3版本:

let indexPath = IndexPath(row: 0, section: 0);
self.tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)
self.tableView(self.tableView, didSelectRowAt: indexPath)

ObjectiveC版本:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView selectRowAtIndexPath:indexPath 
                            animated:YES 
                      scrollPosition:UITableViewScrollPositionNone];
[self tableView:self.tableView didSelectRowAtIndexPath:indexPath];

Swift 2.3版本:

 let indexPath = NSIndexPath(forRow: 0, inSection: 0);
 self.tableView.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: UITableViewScrollPosition.None)
 self.tableView(self.tableView, didSelectRowAtIndexPath: indexPath)

63

UITableView的selectRowAtIndexPath:animated:scrollPosition:应该可以解决问题。

只需传递UITableViewScrollPositionNonescrollPosition,用户就不会看到任何移动。


您还应该能够手动运行操作:

[theTableView.delegate tableView:theTableView didSelectRowAtIndexPath:indexPath]

在您selectRowAtIndexPath:animated:scrollPosition:这样做之后,高亮显示以及所有相关的逻辑发生。


抱歉,这就是我正在使用的。我不小心放了scrollToRowAtIndexPath。我已经更新了问题。scrollToRowAtIndexPath仅突出显示该单元格。
4thSpace 2010年

2
是的,很抱歉。它说不会在我发布的docs链接中触发didSelectRowAtIndexPath。我需要学习阅读。
2010年

@anq:非常感谢!当我在自定义单元格中调用didSelectRowAtIndexPath:indexPath时,它对我有帮助。
Bentley 2015年

21

如果您想选择一些行,这将对您有帮助

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[someTableView selectRowAtIndexPath:indexPath 
                           animated:NO 
                     scrollPosition:UITableViewScrollPositionNone];

这也将突出显示该行。然后委托

 [someTableView.delegate someTableView didSelectRowAtIndexPath:indexPath];

18

Swift 3/4/5解决方案

选择行

let indexPath = IndexPath(row: 0, section: 0)
tblView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom)
myTableView.delegate?.tableView!(myTableView, didSelectRowAt: indexPath)

取消选择行

let deselectIndexPath = IndexPath(row: 7, section: 0)
tblView.deselectRow(at: deselectIndexPath, animated: true)
tblView.delegate?.tableView!(tblView, didDeselectRowAt: indexPath)

对我来说,添加“ .delegate?” 是关键。(快速4.5)
KoreanXcodeWorker

4

iPad和iPhone平台有两种不同的方法,因此您需要同时实现这两种方法:

  • 选择处理程序和
  • 塞古。

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    
    // Selection handler (for horizontal iPad)
    [self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
    
    // Segue (for iPhone and vertical iPad)
    [self performSegueWithIdentifier:"showDetail" sender:self];

3

使用此类别可以选择表行,并在延迟后执行给定segue。
在您的viewDidAppear方法中调用此方法:

[tableViewController delayedSelection:withSegueIdentifier:]


@implementation UITableViewController (TLUtils)

-(void)delayedSelection:(NSIndexPath *)idxPath withSegueIdentifier:(NSString *)segueID {
    if (!idxPath) idxPath = [NSIndexPath indexPathForRow:0 inSection:0];                                                                                                                                                                 
    [self performSelector:@selector(selectIndexPath:) withObject:@{@"NSIndexPath": idxPath, @"UIStoryboardSegue": segueID } afterDelay:0];                                                                                               
}

-(void)selectIndexPath:(NSDictionary *)args {
    NSIndexPath *idxPath = args[@"NSIndexPath"];                                                                                                                                                                                         
    [self.tableView selectRowAtIndexPath:idxPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];                                                                                                                            

    if ([self.tableView.delegate respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)])
        [self.tableView.delegate tableView:self.tableView didSelectRowAtIndexPath:idxPath];                                                                                                                                              

    [self performSegueWithIdentifier:args[@"UIStoryboardSegue"] sender:self];                                                                                                                                                            
}

@end

2
这个问题与se窃无关。
Delete_user 2012年

是的,您的回答中没有任何内容与该问题有关
dulgan 2012年

2
感谢这个答案。如果用户希望实现相同的行为但正在使用情节提要,则此方法非常适用。
Bijoy Thangaraj 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.