You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS中用Objective-C通过UIPopoverPresentationController _passthroughViews导航控制器失败

问题解决方案

一、崩溃问题修复

你的代码存在两个直接触发崩溃的问题:

  1. 未定义的popover变量:代码里直接使用popover.delegate = self和设置背景色,但popover从未被声明或赋值,这会引发野指针崩溃。必须用之前获取的popoverpresentationController对象来操作。
  2. 错误的内存释放:如果项目使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:10:06