titleView仅适用于一个视图控制器(self.navigationController为nil)

时间:2011-10-31 21:20:19

标签: iphone objective-c cocoa-touch uinavigationcontroller uinavigationitem

我有一些在标签控制器下的NIB中设置的导航控制器。我正在尝试在每个navigationcontroller的顶视图控制器中设置相同的徽标。

在出现的第一个视图控制器中,我在viewDidLoad

中有此代码
self.navigationItem.titleView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"green-noback-logo-only.png"]] autorelease];

这很有效(好吧,差不多,我将不得不调整图像大小)并用我的徽标图像替换NIB中设置的文本。

但是,这个完全相同的代码在其他两个视图控制器中都不起作用。相反,我为NIB中的标题设置的任何文本都显示。我已尝试将该代码放在initWithCoder, viewDidLoad, viewDidAppearviewWillAppear中,但它什么也没做。我明确地将leftBarButtonItem设置为nil,尽管我猜测它开始时是零。我已经检查过self.navigationItem在我试图设置titleView的任何地方都不是nil。

任何想法会阻止他们使用titleView设置的其他两个控制器有什么特别之处?否则,有人有更简单的方法来设置titleView吗?

2 个答案:

答案 0 :(得分:1)

尝试将图片视图设置为self.navigationController.navigationItem而不是self.navigationItem

答案 1 :(得分:1)

tl;博士:我搞砸了initWithCoder:

适合初学者的好墙贴画。按照Paul N的回答,我在两个破碎的视图控制器中发现了self.navigationController == nil。我花了几个小时的时间来找出其余部分。

所有三个顶级视图控制器都是UITableViewController的子类。但是,只有两个使用分组样式。我覆盖了initWithCoder:在两个非工作表视图控制器中使用initWithStyle:。这丢弃了与存储在NIB中的导航控制器的连接。我最初这样做是因为我无法弄清楚如何在NIB内部设置分组样式(由another answer here建议)。

我认为,以这种腐烂的方式为我提供子类化是正确的。

无论如何,解决方案是修复initWithCoder:实现以照常调用[super initWithCoder:coder]并在NIB中设置表视图样式。我通过在该视图控制器下拖动表视图,设置数据源,设置委托以及将其设置为分组样式来完成此操作。 (这是默认情况下在NIB中设置表视图控制器的方式。)