Popover segue到静态单元格UITableView会导致编译错误

时间:2012-09-01 15:58:03

标签: xcode ios5 uitableview uistoryboardsegue

我目前有一个带有两个视图控制器的应用程序。第一个是具有嵌入式表视图的视图控制器,该视图控制器具有动态单元。第二个是带有静态单元的表视图控制器。如果我从选择动态表的一个单元格到静态表格视图控制器(使用Push或Modal样式设置)添加一个segue,我可以看到segue按预期工作。但是,当我将样式更改为Popover时,我得到以下编译错误:

Couldn't compile connection: <IBCocoaTouchOutletConnection:0x4004c75a0 <IBProxyObject: 0x400647960> => anchorView => <IBUITableViewCell: 0x400f58aa0>>

有没有其他人遇到此问题,或者有人知道此错误消息可能意味着什么?在编译时发生这种情况似乎很奇怪,除非Popover中不支持静态表视图控制器......

4 个答案:

答案 0 :(得分:15)

我想出了如何做到这一点。你不能把它从故事板上挂起来,但可以这样编程:

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

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad"
                                                 bundle:nil];
    UITableViewController *detailController = [sb instantiateViewControllerWithIdentifier:@"TableSettingDetails"];

    self.popoverController = [[UIPopoverController alloc] initWithContentViewController:detailController];

    self.popoverController.popoverContentSize = CGSizeMake(320, 416);
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    [self.popoverController presentPopoverFromRect:cell.bounds inView:cell.contentView
                          permittedArrowDirections:UIPopoverArrowDirectionAny
                                          animated:YES];
}

只需确保您的控制器中有弹出窗口的引用,否则会立即处理 - 导致其他一些有趣的例外。

答案 1 :(得分:2)

您必须为不属于静态单元格的Popover选择一个锚点。我的建议是将UIButton设置为不可见(自定义类型)。然后选择Popover Segue并将Anchor连接拖到该按钮。

答案 2 :(得分:0)

我知道这个问题已经得到了解答,但是我觉得有一点解决方案是有用的,同时使用segues保留故事板流程。你可以在这里查看 Is it possible to perform a Popover Segue manually (from dynamic UITableView cell)?

答案 3 :(得分:0)

从iOS 10开始,@ lehn0058的正确和接受的答案不再适用。这是他为iOS 10更新的解决方案......

override func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) {
    // *** Next line doesn't work with popover, only full screen detail
    //self.performSegue(withIdentifier: "editRow", sender: self) 
    // Hence, do it by hand...
    let sb = UIStoryboard(name: "Main", bundle: nil)
    let detailVC: MyDetailViewController = sb.instantiateViewController(withIdentifier: "itemEditor") as! MyDetalViewController
    detailVC.modalPresentationStyle = .popover
    detailVC.popoverPresentationController?.sourceView = tableView.cellForRow(at: indexPath)
    detailVC.detailItem = self.itemAtIndexPath(indexPath)

    self.present(detailVC, animated: true, completion: {})
}