2011-11-15 122 views
98

我使用的故事板,我有一個UITableView。我有一個segue設置,從我的桌子上推到細節VC。但是,我應該使用哪種方法來處理這個問題?我將不得不將幾個對象傳遞給詳細視圖。但是,我使用didSelectRowAtIndex還是-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender爲UITableView使用didSelectRowAtIndexPath或prepareForSegue方法?

回答

194

如果你使用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

好了,你可以給一個如何使用通過基於indexPath對象實現它的例子。 – Jon

+0

我已經更新了我的答案。 –

+4

不應該'self.view'只是'發件人'在這裏?我甚至無法得到'[self.view indexPathForSelectedRow]'工作,我不得不''[發件人indexPathForSelectedRow];' – ladookie

5

我這樣做,它的工作

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

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

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

這沒有意義。您應該使用segue或表視圖委託。 只需從Cell中創建一個segue,它就會自動執行您在編寫代碼時所做的同樣的事情。 – Yariv

+3

如何將segue指定給沒有didSelectRow的單元格? – Morkrom

0

如果您使用prepareForSegue:,則可以檢查發件人是誰並執行不同的c頌

例如在迅速

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

    if senderIsTableviewCell 
    { 
     //do something 
    } 
} 
+2

只要做:*如果讓tableViewCell =發件人爲?UITableViewCell {//做某事} *。如果發件人不能轉換爲UITableViewCell,則「執行某些操作」將不會執行。 – mbeaty

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 
} 
3

當發件人是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 
     } 
    } 
1

如果發送者細胞是不可選的,選擇的小區self.tableView.indexPathForSelectedRow回報,但不原因請看發件人細胞。最好的辦法是讓indexPath爲賽格瑞發件人:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    ((MyViewController *)[segue destinationViewController]).senderIndexPath = [self.tableView indexPathForCell:sender]; 
} 

在斯威夫特:

override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) {
  
    (segue.destinationController as! MyViewController).senderIndexPath = self.tableView.indexPathForCell(sender) 
} 
相關問題