为UITableView使用didSelectRowAtIndexPath或prepareForSegue方法?
我正在使用故事板,我有一个UITableView。 我有一个segue设置,从我的表推到细节VC。 但是,我应该使用哪种方法来处理这个问题? 我将不得不将几个对象传递给详细视图。 但是,我使用didSelectRowAtIndex
或-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
?
如果你使用prepareForSegue:sender:
那么你将不会有太多的改变,如果你以后决定从表视图之外的一些控制触发segue。
prepareForSegue:sender:
消息被发送到当前的视图控制器,所以我build议这样的事情:
- (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]; }
在Swift中:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { let path = self.tableView.indexPathForSelectedRow()! segue.destinationViewController.detail = self.detailForIndexPath(path) }
我做到了这一点,它的工作
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ NSLog(@"Row Selected = %i",indexPath.row); [self performSegueWithIdentifier:@"testID" sender:self.view]; }
当发件人是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 } }
如果你的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 }
如果发件人单元格不可选, self.tableView.indexPathForSelectedRow
返回所选单元格,但不会延续发件人单元格。 最好的方法是获得segue发件人的indexPath:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { ((MyViewController *)[segue destinationViewController]).senderIndexPath = [self.tableView indexPathForCell:sender]; }
在Swift中:
override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) { (segue.destinationController as! MyViewController).senderIndexPath = self.tableView.indexPathForCell(sender) }
如果您使用prepareForSegue:
您可以检查发件人是谁,并执行不同的代码
例如在迅速
override func prepareForSegue(segue: UiStoryboardSegue, sender: AnyObject?) { var senderIsTableviewCell:Bool! = sender?.isKindOfClass(UITableViewCell) if senderIsTableviewCell { //do something } }
- 在Xcode 6的Storyboard中,“约束边界”是什么?
- 在故事板中的视图控制器之外的UIView
- 如何“取消”UIStoryBoardSegue
- 以编程方式将视图控制器与故事板一起推送的备选方法
- Storyboard – 参考AppDelegate中的ViewController
- iOS 7:错误的“标签 – 标签”视图框架在运行时会有所不同
- 如何将UIPageControl元素放在UIPageViewController中的滑动页面之上?
- Xcode故事板警告:在当前configuration中closures约束引用项目。 closures当前configuration中的这个约束
- 故事板如何在iOS 5中工作?