我找到了很多很好的例子,说明如何使用自定义图像作为UINavigationBar的背景,而不会在不同视图之间或之间导航时隐藏任何按钮。但是,我有以下问题,我似乎没有答案。
我有一个UITabBarViewController对象作为根控制器,我已经添加了许多不同的UINavigationControllers对象作为子视图(每个选项卡一个),每个对象都使用UITableViewController对象作为其根控制器进行初始化。从每个表视图中,可以导航到子控制器,该子控制器显示有关所选单元的更多详细信息。现在问题是:
在每个表视图的导航控制器中,我设置了自定义背景图像。这是通过覆盖UINavigationBar的drawRect方法来完成的。当用户向下导航到每个表视图的详细视图时,应该使用详细视图的标题替换该图像。我通过使用全局变量完成此操作,并在每个视图的每个viewWillAppear方法中更新它,并在覆盖的drawRect方法中使用if条件。所以用一些代码来说明这一点:
在app delegate .h.file中,我将外部变量声明为:
extern BOOL displayImage;
在app delegate .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方法。在此期间,外部变量正确更新。
有没有人可以告诉我这里可能做错了什么?
由于
答案 0 :(得分:0)
我也处于同样的境地。如果我遇到问题,在不同选项卡之间切换时,导航栏中的图像不会消失。所以你需要创建两个图像,一个是普通图像,另一个是黑色图像。
使用黑色图像而不是在类别中的drawrect方法的else部分设置黑色。并且在从页面切换时重置viewWillDisappear中的变量,而不是在下一页上设置变量。可能是你的问题得到解决。