iOS中用Objective-C通过UIPopoverPresentationController _passthroughViews导航控制器失败
问题解决方案
一、崩溃问题修复
你的代码存在两个直接触发崩溃的问题:
- 未定义的
popover变量:代码里直接使用popover.delegate = self和设置背景色,但popover从未被声明或赋值,这会引发野指针崩溃。必须用之前获取的popoverpresentationController对象来操作。 - 错误的内存释放:如果项目使用ARC(自动引用计数),手动调用
[sv release]会导致过度释放崩溃;如果是非ARC环境,在presentViewController后立即释放控制器也不安全,因为此时控制器仍处于展示状态。
修正后的代码示例
SelectorViewController* sv = [[SelectorViewController alloc] initWithStyle:UITableViewStylePlain]; sv.delegate = self; sv.currentTopic = self.title; NSLog(@" sv.currentTopic%@", sv.currentTopic); sv.preferredContentSize = CGSizeMake(300, 500); sv.modalPresentationStyle = UIModalPresentationPopover; UIPopoverPresentationController *popoverPC = sv.popoverPresentationController; popoverPC.delegate = self; popoverPC.sourceView = sender.view; // 设置passthroughView,允许穿透交互的视图,示例为当前控制器的view popoverPC.passthroughView = self.view; // 设置弹窗背景色(如果需要) if ([popoverPC respondsToSelector:@selector(setBackgroundColor:)]) { popoverPC.backgroundColor = [UIColor whiteColor]; } [self presentViewController:sv animated:YES completion:nil]; // ARC环境下无需手动release;非ARC环境下注释此行,或在控制器dismiss后再释放 // [sv release];
二、弹窗最后一项无高亮/点击无效问题
该问题多由单元格交互区域被遮挡或设置错误导致,按以下方向排查:
- 检查单元格选择样式:在
SelectorViewController的tableView:cellForRowAtIndexPath:方法中,确保单元格未被设置为不可选中:cell.selectionStyle = UITableViewCellSelectionStyleDefault; - 调整表格内边距:若弹窗高度刚好适配行数,最后一行可能被弹窗底部边界或安全区域遮挡,导致点击区域不可交互。在
SelectorViewController的viewDidLoad中添加:self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 16, 0); // 底部增加16pt内边距,可按需调整 - 验证弹窗高度合理性:核对
preferredContentSize的高度是否匹配表格实际内容高度,避免因高度设置不当导致行被截断,无法触发点击。
内容的提问来源于stack exchange,提问作者sejn
相关产品推荐
相关产品推荐

