自定义视图中的崩溃作为 UINavigationControllers navigationItem.titleView

Posted

技术标签:

【中文标题】自定义视图中的崩溃作为 UINavigationControllers navigationItem.titleView【英文标题】:Crasher in a custom view as UINavigationControllers navigationItem.titleView 【发布时间】:2011-09-10 20:50:03 【问题描述】:

我有一个UIViewController,其视图属性中有几个子视图(UISearchbar 和几个UIButtons)。 UIButtons 与典型的 IBActions 挂钩,例如 -(IBAction)buttonPressed:(id)sender 用于 UIControlEventTouchUpInside 状态 - 无论我是在 IB 中还是以编程方式执行它都没有关系。

- (void)viewDidLoad 
    MUZTitleViewController *title = [[MUZTitleViewController alloc] 
                                     initWithNibName:nil bundle:nil];
    self.navigationItem.titleView = title.view;

在我的项目中还有一个UINavigationController。当我将UINavigationBarnavigationItem.titleView 设置为我的UIViewControllers 视图的视图时,只要我点击其中一个按钮,就会得到一个EXC_BAD_ACCESS 异常。我不知道这是为什么。

我上传了一个小示例项目来说明我的问题:Test010.xcodeproj(启用了 ARC)

我越来越多地得出结论,使用UIViewControllers 视图并将其分配给titleView 不是一个好主意,但我在这里看不到任何替代方案。

编辑:对不起,示例项目注释掉了导致异常的调用。我重新上传了链接的项目文件。

Edit^2: 正如 PengOne 指出的那样,我已经跳过了我收到的确切错误消息:

2011-09-10 23:09:50.621 Test010[78639:f803] -[CALayer buttonPressed:]: unrecognized selector sent to instance 0x9254ae0
2011-09-10 23:09:50.623 Test010[78639:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CALayer buttonPressed:]: unrecognized selector sent to instance 0x9254ae0'

【问题讨论】:

请发布确切的错误信息。 【参考方案1】:

您是否尝试将 NSZombieEnabled 设置为 YES?如果我这样做,控制台会显示以下输出:

2011-09-10 22:56:23.329 Test010[6481:ef03] *** -[MUZTitleViewController
performSelector:withObject:withObject:]: message sent to deallocated 
instance 0x7a7ff70

由于项目启用了 ARC,因此控制器似乎在此行之后的某个时间被释放:

MUZTitleViewController *title = [[MUZTitleViewController alloc] initWithNibName:nil bundle:nil];

我不确定最好的解决方案是什么,但一个属性肯定有助于防止这样的异常:

// MUZDetailViewController.h
@property (strong, nonatomic) MUZTitleViewController *title;

// MUZDetailViewController.m
@synthesize title;

self.title = [[MUZTitleViewController alloc] initWithNibName:nil bundle:nil];
self.navigationItem.titleView = title.view;

【讨论】:

非常感谢。事实上,问题在于 ARC 在从按钮 UIControlEvent 调用它之前释放了我的 VC。使其成为实例化 VC 的属性可确保 ARC 不会过早地释放它。【参考方案2】:

您在使用 ARC 时遇到的问题也可以通过将应用程序的初始视图控制器设置为主窗口的 rootViewController 属性而不是使用 addSubview 来解决。

这样做可以避免将每个自定义视图控制器添加为属性。

【讨论】:

以上是关于自定义视图中的崩溃作为 UINavigationControllers navigationItem.titleView的主要内容,如果未能解决你的问题,请参考以下文章

尝试通过列表视图显示数据时应用程序崩溃

UIView drawRect 安静崩溃

android xml,布局中自定义视图的崩溃

使用浮动或分数样式资源的自定义视图崩溃

UITableViewCell Swift 中的自定义视图

自定义视图控制器转换偶尔崩溃