titleView 仅适用于一个视图控制器(self.navigationController 为 nil)
Posted
技术标签:
【中文标题】titleView 仅适用于一个视图控制器(self.navigationController 为 nil)【英文标题】:titleView only works in one view controller (self.navigationController is nil) 【发布时间】:2011-10-31 21:20:19 【问题描述】:我在标签控制器下的 NIB 中设置了一些导航控制器。我正在尝试在每个导航控制器的顶视图控制器中设置相同的徽标。
在出现的第一个视图控制器中,我在viewDidLoad
中有这段代码:
self.navigationItem.titleView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"green-noback-logo-only.png"]] autorelease];
这行得通(好吧,几乎,我将不得不调整图像大小)并用我的徽标图像替换 NIB 中设置的文本。
但是,这个完全相同的代码在其他两个视图控制器中都不起作用。相反,我在 NIB 中为标题设置的任何文本都会显示。我试过将该代码放在initWithCoder, viewDidLoad, viewDidAppear
和viewWillAppear
中,但它什么也没做。我明确地将leftBarButtonItem
设置为 nil,尽管我猜它一开始就是 nil。我还检查了 self.navigationItem 在我尝试设置 titleView 的任何地方都不为零。
知道其他两个控制器有什么特别之处会阻止它们设置 titleView 吗?否则,有没有人有更万无一失的方法来设置titleView?
【问题讨论】:
好的,多亏了 Paul N,我发现有些地方不对劲,因为 navigationController 为 nil。我正在调查。 【参考方案1】:尝试将图像视图设置为self.navigationController.navigationItem
而不是self.navigationItem
。
【讨论】:
事实上,看起来 self.navigationController 在所有这些方法中都是 nil。 mmmm,试试这个: UIImage *image = [UIImage imageNamed:@"TableviewCellLightBlue.png"]; UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; [self.navigationController.navigationBar.topItem setTitleView:imageView]; 确实可以看到这个链接:***.com/questions/1553118/…。问题是我之前添加的代码,用于设置标题图像,答案是将图像设置为导航栏背景的代码。 就像我说的,self.navigationController 是 nil...所以调用它的方法不会做任何事情。【参考方案2】:tl;dr:我搞砸了initWithCoder:
。
对于初学者来说是一个很好的壁垒。按照 Paul N 的回答,我在两个损坏的视图控制器中发现了 self.navigationController == nil
。我又花了几个小时的主管才弄清楚剩下的事情。
所有三个***视图控制器都是 UITableViewController 的子类。但是,其中只有 两个 使用了分组样式。我在两个非工作表视图控制器中覆盖 initWithCoder:
以使用 initWithStyle:
。这丢弃了与存储在 NIB 中的导航控制器的连接。我最初这样做是因为我不知道如何在 NIB 内部设置分组样式(由 another answer here 建议)。
我猜,这对我以如此糟糕的方式进行子类化很有帮助。
无论如何,解决方案是修复initWithCoder:
实现以照常调用[super initWithCoder:coder]
并在NIB 中设置表格视图样式。我通过在该视图控制器下拖动一个表视图、设置数据源、设置委托并将其设置为分组样式来做到这一点。 (这是默认情况下在 NIB 中设置表视图控制器的方式。)
【讨论】:
以上是关于titleView 仅适用于一个视图控制器(self.navigationController 为 nil)的主要内容,如果未能解决你的问题,请参考以下文章
UIScrollView 是不是仅适用于嵌入在导航控件中的视图控制器?
uitableview didselectrowatindex 仅适用于第一个表视图而不适用于同一视图控制器中的第二个表视图?
对象 addSubview 仅适用于 viewDidLoad