我找到了足够好的例子,说明如何使用自定义图像作为 UINavigationBar 的背景,而不在不同视图之间导航之后或期间隐藏任何按钮。但是,我有以下问题,我似乎没有答案。
我有一个 UITabBarViewController 对象作为根控制器,我在其中添加了许多不同的 UINavigationControllers 对象作为子视图(每个选项卡一个),每个都使用 UITableViewController 对象作为它们的根控制器进行初始化。从每个表格视图都可以导航到一个子控制器,该控制器显示有关所选单元格的更多详细信息。现在我遇到的问题如下:
在每个表格视图的导航控制器中,我设置了一个自定义背景图像。这是通过覆盖 UINavigationBar 的 drawRect 方法来完成的。当用户向下导航到每个表视图的详细视图时,应将图像替换为详细视图的标题。我通过使用全局变量来完成此操作,并在每个视图的每个 viewWillAppear 方法中更新它,并在覆盖的 drawRect 方法中使用 if 条件。所以用一些代码来说明这一点:
在应用程序委托 .h.file 中,我将外部变量声明为:
extern BOOL displayImage;
在应用程序委托 .m 文件中,我将外部变量初始化为:
BOOL displayImage = TRUE;
对于所有视图控制器,viewWillAppear 方法的实现如下:
// View where I want to show the image in the navigation bar
- (void)viewWillAppear:(BOOL)animated {
...
self.navigationItem.title = nil; // No title
displayImage = TRUE;
[self.navigationController.navigationBar setNeedsDisplay];
...
}
// View where I do NOT want to show the image in the navigation bar
- (void)viewWillAppear:(BOOL)animated {
...
self.title = @"Info";
displayImage = FALSE;
[self.navigationController.navigationBar setNeedsDisplay];
...
}
// Overwritten drawRect method of UINavigationBar
- (void)drawRect:(CGRect)rect {
if (displayImage) {
// Code that draws the image by calling drawInRect
} else {
// Code that just sets a black background
}
}
当我从表视图导航到详细视图(表视图的子控制器)并返回父视图时,这非常有用。但是,当我从详细视图导航到选项卡栏的另一个选项卡时,详细视图的标题消失并且图像重新出现(到目前为止一切都很好),但是当我导航回包含详细视图的选项卡时,详细视图的标题出现,但图像不会消失(即标题和图像都显示在导航栏中)。在这种情况下似乎没有调用 setNeedsDisplay 方法。在所有这些过程中,外部变量都会正确更新。
有没有人可以告诉我我在这里可能做错了什么?
谢谢