表格视图单元格转场不起作用

9
我想做一件非常简单的事情:设置一个segue,当你点击表格中的单元格时,它会带你到另一个视图控制器。问题是,我认为这个问题源于TableView嵌入在一个普通的ViewController中(而不是TableViewController),并且是这个ViewController中的两个子视图之一。
据我所知,我已经正确地设置了所有内容:我将具有两个子视图的ViewController嵌入了Navigation Contoller中,并将其设置为TableView的dataSource和delegate,同时也从TableViewCe ll创建了一个push segue到故事板中的第二个视图控制器。然而,当用户单击表格中的行时,它仅仅选择了行,而segue根本没有触发(我进行了调试,prepareForSegue函数甚至都没有被调用)。
我是否缺少什么?或者如果TableView不是其视图控制器中唯一的视图,则出于某种原因不可能实现这一点吗?

你是否为表格单元格分配了唯一的标识符? - Mick MacCallum
我在storyboard中(原型单元格的属性)和cellForRowAtIndexPath函数中都给单元格赋予了“LoadCell”标识符;这样做正确吗,还是每个单元格在创建时应该被赋予一个不同的标识符? - generaltsow
6个回答

6
我发现如果我最近已经从单元格的附属视图中连线,然后稍后删除该连线并尝试直接将新连线连接到单元格,它不起作用(使用Xcode 4.6.2)-即使没有辅助视图,Xcode仍会连接连线到辅助视图!我解决问题的方法是在IB中选择单元格,并使用连接检查器来(1)删除原始的“辅助操作”连线,以及(2)通过从下面图片中的实心圆拖动到适当的目标视图控制器来直接连线“选择”连线。

enter image description here


仍然适用于Xcode 8 :) 非常感谢。解决了我的问题。 - gutte
在Xcode 13中,这对我仍然是一个问题。 - Stewart Macdonald

4

这可能有助于您,也可能没有帮助,但我之所以遇到此问题是因为我定义了两种不同的单元格类型,并提供了didSelectRowAtIndexPath实现。我必须在didSelectRowAtIndexPath中添加[self performSegueWithIdentifier:@"Whatever" sender:self],然后问题得到解决。

如果您能够至少检测到行选择,则可以利用此方法。


这对我解决了问题,但使用的发送者是单元格: sender:[self.tableView cellForRowAtIndexPath:indexPath] - brasskazoo

4
如果您已经自定义了单元格渲染,例如:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

确保您正在使用与“ste”中指定的原型单元格相同的单元格标识符。

因此,在这种情况下,连接segue的单元格的“标识符”应设置为“Cell”。


花了过去两个小时尝试解决这个问题(今晚才开始混迹于Objective-C。非常感谢,你让我从疯狂中摆脱出来!) - user676853

2
如果您在Xcode中创建StoryBoard,请按照以下步骤操作:
  1. 创建一个UITableViewController
  2. 添加一个原型UITableViewCell
  3. 创建将成为segue目标的UIViewController。
  4. 控制单击原型UITableViewCell并拖动到segue目标。
就这样。 您可能需要编辑UITableViewCell的特征,例如,将其子类化为UITableViewCell。

2
这正是我所做的,只不过我没有使用UITableViewController,而是使用了普通的UIViewController,并在主视图中将UITableView(以及另一个UIView)作为子视图。但它仍然无法工作。 - generaltsow
在Xcode中,tableViewCell的“push”故事板segue是否链接到您的segue目标控制器? - GoZoner

0
我曾经遇到过类似的问题。 解决方法如下: 1. 在Storyboard中为segue编写SegueIdentifier 2. 在didSelectRowAtIndexPath中添加以下代码:[self performSegueWithIdentifier:@"SegueIdentifier" sender:nil];
希望这能有所帮助。

对我有用。谢谢! - kalan nawarathne
添加performSegueWithIdentifier会导致我的应用程序崩溃,在-[UITableViewCell _setHostsLayoutEngine:]中抛出断言失败。显然,以前没有人遇到/解决过这个问题,因为在SO上没有答案。 - Kaveh Vejdani

-1

遇到了同样的问题。在普通视图控制器中,从原型表格视图单元中进行Segue会导致应用程序崩溃。如果有人遇到同样的问题。

我的解决方案:

如果您使用的是push segue,请确保包含表视图的第一个视图控制器嵌入了导航控制器,否则“push segues”将无法正常工作。此外,将Segue指向目标视图控制器,而不是其导航控制器!

并且如前所述,请确保您的“segue identifiers”正确。

在“didSelectRowAtIndexPath”中,我调用“[self performSegueWithIdentifier:@“Your_destination_View_Controller” sender:self]”;


添加 performSegueWithIdentifier 会导致我的应用程序崩溃,在 -[UITableViewCell _setHostsLayoutEngine:] 中抛出断言失败。显然以前没有人遇到/解决过这个问题,因为 SO 上没有答案。 - Kaveh Vejdani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接