对UITableView使用didSelectRowAtIndexPath或prepareForSegue方法?

时间:2011-11-15 01:58:27

标签: ios objective-c iphone uitableview storyboard

我正在使用故事板,我有一个UITableView。我有一个segue设置,从我的表推送到细节VC。但是我应该使用哪种方法来处理这个问题?我必须将几个对象传递给详细视图。但我是否使用didSelectRowAtIndex-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

6 个答案:

答案 0 :(得分:196)

如果您使用prepareForSegue:sender:,那么如果您以后决定从表格视图之外的某个控件触发segue,那么您将无法进行更改。

prepareForSegue:sender:消息被发送到当前视图控制器,所以我建议这样的事情:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Assume self.view is the table view
    NSIndexPath *path = [self.tableView indexPathForSelectedRow];
    DetailObject *detail = [self detailForIndexPath:path];
    [segue.destinationViewController setDetail:detail];
}

在斯威夫特:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let path = self.tableView.indexPathForSelectedRow()!
    segue.destinationViewController.detail = self.detailForIndexPath(path)
}

答案 1 :(得分:5)

我做了这个并且有效

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

    NSLog(@"Row Selected = %i",indexPath.row);

    [self performSegueWithIdentifier:@"testID" sender:self.view];    
}

答案 2 :(得分:3)

当sender是UITableViewCell时,您可以要求UITableView查询单元格的indexPath。

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let cell = sender as? UITableViewCell {
            let indexPath = self.tableView.indexPathForCell(cell)!
            assert(segue.destinationViewController.isKindOfClass(DetailViewController))
            let detailViewController = segue.destinationViewController as! DetailViewController
            detailViewController.item = self.items[indexPath.row] // like this
        }
    }

答案 3 :(得分:1)

如果你的tableView属性在另一个类中并且只有一个部分,那么你可以使用tag属性来存储单元格的行,如:

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

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

     cell.tag = indexPath.row;

     return cell;
}

然后您可以访问它,因为sender是与其标记中的行值相同的单元格:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    MyDestinationViewController *destinationViewController = segue.destinationViewController;
    destinationViewController.myProperty = [tableViewElementsArray objectAtIndex:[sender tag]]; // sender will be your cell 
}

答案 4 :(得分:1)

self.tableView.indexPathForSelectedRow返回所选单元格,但不返回segue发送方单元格,例如未选择发件人单元格(附件操作)或多选案例。最好的方法是获取segue发送者的indexPath:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    __auto_type itemViewController = (id<ItemViewController>)segue.destinationViewController;
    itemViewController.senderIndexPath = [self.tableView indexPathForCell:sender];
}

在斯威夫特:

protocol ItemViewController {
    var senderIndexPath : IndexPath? { get set }
    var selectedIndexPaths : [IndexPath]? { get set }
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if  let cell = sender as? UITableViewCell,
        var itemViewController = segue.destination as? ItemViewController {
        itemViewController.senderIndexPath = tableView.indexPath(for: cell)
        itemViewController.selectedIndexPaths = tableView.indexPathsForSelectedRows
    }
}

答案 5 :(得分:0)

如果您使用prepareForSegue:,则可以检查发件人是谁并执行不同的代码

例如在swift中

override func prepareForSegue(segue: UiStoryboardSegue, sender: AnyObject?)
{
   var senderIsTableviewCell:Bool! = sender?.isKindOfClass(UITableViewCell)

   if senderIsTableviewCell
   {
       //do something
   }
}