我目前有一个带有两个视图控制器的应用程序。第一个是具有嵌入式表视图的视图控制器,该视图控制器具有动态单元。第二个是带有静态单元的表视图控制器。如果我从选择动态表的一个单元格到静态表格视图控制器(使用Push或Modal样式设置)添加一个segue,我可以看到segue按预期工作。但是,当我将样式更改为Popover时,我得到以下编译错误:
Couldn't compile connection: <IBCocoaTouchOutletConnection:0x4004c75a0 <IBProxyObject: 0x400647960> => anchorView => <IBUITableViewCell: 0x400f58aa0>>
有没有其他人遇到此问题,或者有人知道此错误消息可能意味着什么?在编译时发生这种情况似乎很奇怪,除非Popover中不支持静态表视图控制器......
答案 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: {})
}