UINavigationController 和 titleView

Posted

技术标签:

【中文标题】UINavigationController 和 titleView【英文标题】:UINavigationController and titleView 【发布时间】:2011-11-21 15:45:20 【问题描述】:

我的应用程序适合 UINavigationController。 只需我将MyUIViewController 设置为navigationControllerrootViewController,然后在viewDidLoad 内部为myViewControllernavigationItem 设置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的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationController 标题和按钮

(Swift) 在嵌套在 Main UINavigationController 中的 UINavigationController 和 UITabController 之间切换

UINavigationController 和 titleView

UINavigationController 子类和推送 Segue

关闭 UINavigationController 并呈现另一个 UINavigationController

继承 UITabBarController 和 UINavigationController