有条件的segue在UITableViewCell上点击执行

我正在使用Xcode 4.2开发iOS 5项目。 我有一个UITableViewController,并希望当用户点击表格单元时执行一个segue,但目标视图控制器取决于该单元格上执行的操作。 例如,当用户点击单元格我想加载SomeViewController,但是当用户在编辑模式下点击相同的单元格我想加载AnotherViewController。 不幸的是,在Xcode 4.2 storyboard builder中,没有办法在同一个单元格上configuration多个segues,或者我不明白。 也许有一种方法可以在代码编辑器中手动创buildsegue。 一般来说,我想实现的目的是为用户提供一种方法,使用一个视图控制器“input”由单元格表示的项目,并使用另一个视图控制器“编辑”由同一个单元格表示的项目。 在表编辑模式下切换到第二个视图控制器(编辑器)只是我第一次,但也许有更好的办法。 任何帮助将不胜感激。

在查看Storyboard的同时,从源视图控制器拖动到目标视图控制器。 这将创build一个segue,您可以直接从源视图控制器以编程方式触发。 确保你给你一个名字。 这个名称是你将传入源视图控制器的performSegue:withIdentifier:方法。

我只是添加了一个额外的答案,因为在除了这个以外的许多地方阅读上面select的一个之后 – 这正确的答案 – 我发现自己想知道如何检测通常会触发延迟的触摸。 你看,如果你通过从表格视图单元格拖动到下一个控制器来创build你自己的segue,那么有两件事情会自动完成。

  1. 检测到单元中的触摸
  2. 继续执行

但是,当然,你不能阻止赛格。

现在,如果你想有条件地继续 ,那么(如其他答案中所提到的),你删除了这个segue,并从UITableViewController创build一个新的(从对象导航器而不是故事板拖动)到下一个控制器 – 并给它一个名称。

然后 – 这是我所缺less的部分 – 在您的表视图控制器中实现tableView:didSelectRowAtIndexPath执行segue编程和条件,如下所示。

请注意,您还需要以某种方式识别您的单元格,以便知道是否select了您感兴趣的单元格。 你可以通过知道静态表中的索引path来做到这一点,但是我更喜欢在IB中设置单元格的唯一标识符(即使我不需要它,因为它是一个静态表),并检查它。 这样,如果我在静态表中移动我的单元格,我将不需要更改此代码。

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // Find the selected cell in the usual way UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; // Check if this is the cell I want to segue from by using the reuseIdenifier // which I set in the "Identifier" field in Interface Builder if ([cell.reuseIdentifier isEqualToString:@"CellIWantToSegueFrom"]) { // Do my conditional logic - this was the whole point of changing the segue if (myConditionForSegueIsSatisfied) { // Perform the segue using the identifier I was careful to give it in IB // Note I'm sending the cell as the sender because that's what the normal // segue does and I already had code counting on that [self performSegueWithIdentifier:@"SegueIdentifer" sender:cell]; } } 

请注意,我是如何使用segue发送单元格的 – 从单元格中正常的segue是这样做的,而且我本来是通过nil的,我的代码依赖于它停止了工作。

这是一个古老的问题和一些很好的正确答案,但我会发布一些额外的信息,当我遇到这种情况时我觉得很有帮助:

  1. 如果您通过ctl +从SomeVC拖动到另一个VC,在故事板中创build一个segue,请将其删除。

  2. 在对象导航器中,ctl +将ViewController级别(通常在VC名称下的层级中的第一个级别)从SomeVC拖动到AnotherVC。 给segue一个唯一的标识符。

  3. 实现tableView: didSelectRowAtIndexPath:如上所述。

  4. 我发现在tableView: didSelectRowAtIndexPath:使用switch语句很有帮助tableView: didSelectRowAtIndexPath:

     switch (indexPath.row) { case 0: [self performSegueWithIdentifier:@"yourIDHere" sender:self]; break; case 1: // enter conditional code here... break; case 2: // enter conditional code here... break; // ... for however many cells you require default: break; 

    }

谢谢大家的好评。

你可以通过下面的方法轻松的控制你自定义的UIViewController中的任何segue的打开:

override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool { return true // or false, depending on what you need }