UINavigationController 和 titleView
Posted
技术标签:
【中文标题】UINavigationController 和 titleView【英文标题】:UINavigationController and titleView 【发布时间】:2011-11-21 15:45:20 【问题描述】:我的应用程序适合 UINavigationController
。
只需我将MyUIViewController
设置为navigationController
的rootViewController
,然后在viewDidLoad
内部为myViewController
的navigationItem
设置customTitleView
。
现在,当我推送 newViewController
时,我希望看到以前的 customTitleView
(如 Apple NavigationController 参考所述),但它没有。
怎么了?
下面的一小部分代码和 Apple UINavigationController 参考
“如果新的***视图控制器具有自定义标题视图,导航栏会显示该视图以代替默认标题视图。要指定自定义标题视图,请设置视图控制器导航项的 titleView 属性。 "
- (void)viewDidLoad
[super viewDidLoad];
[self.navigationItem setTitleView:customTitleView];
也许“默认标题视图”意味着“什么都没有”?我把它解释为之前的titleView。
编辑
我正在尝试解决方法,但我还有一些其他问题。 解决方法是:
在我在 viewDidLoad 中设置的 NavigationController 中推送的每个 ViewController 中,titleView 从 rootViewController 获取它
UiView *originalContainer = [[[self.navigationController.viewControllers objectAtIndex:0] navigationItem] titleView]
我创建了一个 newTitleView 并将其放入 originalContainer.subviews (UIButton) 中,因为我需要它的 Target 操作。
对于第一个推送的控制器来说一切都很好,但是如果我在堆栈中推送另一个 viewController(第二个推送)我会丢失对导航控制器的所有引用。每个实例变量都是 nil。
这些值是在 viewDidLoad 中获取的
firstViewControllerPushed.navigationController = (UINavigationController*)0x6693da0 firstViewControllerPushed.parentViewController = (UINavigationController*)0x6693da0
secondViewControllerPushedFromFirstViewControllerPushed.navigationController = 0x0 secondViewControllerPushedFromFirstViewControllerPushed.parentViewController = 0x0
似乎 secondViewControllerPushed 无处可去!!
这怎么可能?
我仔细检查了我是否正确推送了 viewController 而不是模态显示它
由于这个问题,我无法为 secondViewControllerPushed 正确设置 newTitleView。
【问题讨论】:
我已经删除了我的答案,因为它显然是错误的;对不起。 【参考方案1】:这是一半的技巧,但我觉得它可以让您在正在使用的 viewController 中获得更多控制权。所以下面是我设置的一个小方法,然后我只是在 viewDidLoad - [self setUpNavBar] 中调用它;
并且使用 [UIButton buttonWithType:101] 非常好,因为它通过了 Apple 验证。
- (void) setUpNavBar
[self.navigationController setNavigationBarHidden: NO animated:YES];
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
self.title = @"Settings";
UIButton* backButton = [UIButton buttonWithType:101]; // left-pointing shape
[backButton addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside];
[backButton setTitle:@"Back" forState:UIControlStateNormal];
UIBarButtonItem* backItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
self.navigationItem.leftBarButtonItem = backItem;
[backItem release];
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Logout"
style:UIBarButtonItemStylePlain target:self
action:@selector(logoutAction)] autorelease];
【讨论】:
我正在尝试类似于您的解决方法,但我遇到了一些问题。我更新了问题。以上是关于UINavigationController 和 titleView的主要内容,如果未能解决你的问题,请参考以下文章
(Swift) 在嵌套在 Main UINavigationController 中的 UINavigationController 和 UITabController 之间切换
UINavigationController 和 titleView
UINavigationController 子类和推送 Segue