为UINavigationBar或标题设置自定义图像:导航期间的混淆

时间:2011-03-28 11:30:52

标签: uinavigationcontroller uitabbarcontroller uinavigationbar uinavigationitem

我找到了很多很好的例子,说明如何使用自定义图像作为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方法。在此期间,外部变量正确更新。

有没有人可以告诉我这里可能做错了什么?

由于

1 个答案:

答案 0 :(得分:0)

我也处于同样的境地。如果我遇到问题,在不同选项卡之间切换时,导航栏中的图像不会消失。所以你需要创建两个图像,一个是普通图像,另一个是黑色图像。

使用黑色图像而不是在类别中的drawrect方法的else部分设置黑色。并且在从页面切换时重置viewWillDisappear中的变量,而不是在下一页上设置变量。可能是你的问题得到解决。