弹出回到视图时,UINavigationController中的自定义UIToolbar的rightBarButtonItem消失

时间:2010-11-19 13:06:42

标签: iphone uinavigationcontroller uitoolbar rightbarbuttonitem

编辑2: 我现在已经解决了这个问题。我正在为我的UINavigationBar设置自定义背景图像,如下所示:

UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 44.0)];
[imgView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"NavigationBarBackground" ofType:@"png"]]];
[navBar addSubview:imgView];
[navBar sendSubviewToBack:imgView];
[imgView release];

对于UINavigationController的视图控制器堆栈上的第一个视图控制器来说这很好,但是任何子视图都会重新运行此代码并将自定义背景放在前面。

修复: 只需在导航控制器上删除自定义背景的所有代码,然后按以下方式扩展UINavigationBar类:

创建一个名为UINavigationBar + CustomImage的新.h / .m文件。将.h代码设置为:

@interface UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect;
@end

.m到:

#import "UINavigationBar+CustomImage.h"

@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect {
    UIImage *image = [UIImage imageNamed: @"NavigationBarBackground.png"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end

瞧!现在一切都很好。

---结束编辑2 ---

我有一个UINavigationController,可以这样钻取:

HOMEPAGE > DETAIL PAGE > MAP VIEW

DETAIL PAGE将自定义UIToolbar(带有三个按钮)添加到viewDidLoad中的rightBarButtonItem,如下所示:

UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 1.0, 157.0, 44.1)];
[imgView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"NavigationBarBackground" ofType:@"png"]]];
[tools addSubview:imgView];
[tools sendSubviewToBack:imgView];
[tools setTintColor:[UIColor colorWithRed:127/255.0 green:184/255.0 blue:72/255.0 alpha:1.0]];
[imgView release];

NSMutableArray* buttons = [[NSMutableArray alloc] initWithCapacity:3];

UIBarButtonItem* bi = [[UIBarButtonItem alloc] initWithTitle:@"Filter" style:UIBarButtonItemStyleBordered target:self action:NULL];

[buttons addObject:bi];
[bi release];

bi = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Map.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(showMap:)];

[buttons addObject:bi];
[bi release];

bi = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Favourite.png"] style:UIBarButtonItemStyleBordered target:self action:NULL];
[buttons addObject:bi];
[bi release];

[tools setItems:buttons animated:NO];

[buttons release];

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:tools];

在查看DETAIL VIEW页面时显示完美,当我转到MAP VIEW时,自定义UIToolbar消失(按预期方式),但是,当返回DETAIL VIEW时,自定义UIToolbar不再可见。但是,它仍然存在,因为我仍然可以点击“地图”按钮所在的区域,并将其推回到MAP VIEW。

您是否知道如何在返回DETAIL视图时再次显示此UIToolbar?

我尝试在viewWillAppear中重建自定义UIToolbar,它具有与上面完全相同的效果。

编辑 - 如果我在viewDidAppear方法中放置构建自定义UIToolbar的代码,则此方法有效。我不喜欢这个解决方案,因为视图向后滑动,然后出现自定义rightBarButtonItem。这是否与导航控制器在页面显示之前未被初始化有关?

2 个答案:

答案 0 :(得分:1)

如果它在viewDidAppear中有效,你可以试试viewWillAppear。一般来说,我从未见过将UIToolbar设置为UIBarButtonItem,因此我不一定会期望标准行为。让我知道它是怎么回事。

答案 1 :(得分:0)

Apple UI API经常以不寻常的方式失败,当你尝试做任何甚至有点不寻常的事情时(甚至 应该工作的东西),并且尝试将UIToolbar插入到rightBarButtonItem中肯定属于我的定义“异常”。

您真正应该做的是隐藏导航栏并将UIToolbar添加为视图控制器主视图的子视图。或者,您可以完全避免使用UIToolbar,并在自定义视图中自行实现这些按钮。