【问题标题】:Modal View Controllers - UIBarButtonItems Do Not Persist模态视图控制器 - UIBarButtonItems 不持久
【发布时间】:2013-08-21 14:28:08
【问题描述】:

我展示了模态视图控制器,封装在 UINavigationController 中。

当它们第一次出现时,条形按钮项是好的。

但是,如果我单击一个按钮并将一个新的视图控制器推送到 UINavigationController,然后我使用该视图控制器的后退按钮,它会弹回原来的模式视图控制器按钮不显示,(但当我单击它们时它们会起作用 -> 只是看不到它们)

我似乎无法弄清楚为什么会发生这种情况。

这是一些代码。

哦,顺便说一下,我自定义了导航控制器的导航栏背景。我有一种感觉,这可能会导致这种视觉干扰,但我不知道要改变什么才能让它正确。

在GGMainViewController中:

GGSelectTeamsViewController *chooseTeam = [[GIFSelectTeamsViewController alloc] init];
UINavigationController* navigationController = [[UINavigationController alloc] initWithRootViewController:chooseTeam];
[self setupModalNavigationBar:navigationController];
[self presentViewController:navigationController animated:YES completion:nil];

- (void)setupModalNavigationBar:(UINavigationController *)nav {
    // unnecessary code removed for a quicker read
    // basically navigation bar has a background gradient as well as a bottom border
    [nav.navigationBar.layer addSublayer:bottomBorder];
    [nav.navigationBar.layer addSublayer:gradient];

}

在 GGSelectTeamsViewController 中

- (void)viewDidLoad
{
    [super viewDidLoad];
    title = [[UILabel alloc] init];
    title.text = someText;
    title.backgroundColor = [UIColor clearColor];
    title.textColor = [UIColor whiteColor];
    self.navigationItem.titleView = title;
    [title sizeToFit];

    UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [backButton setTitle:@"Back" forState:UIControlStateNormal];
    [backButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    backButton.frame = someFrame;
    [backButton addTarget:self action:@selector(goBack) forControlEvents:UIControlEventTouchUpInside];
    [self.navigationItem setLeftBarButtonItem:[[UIBarButtonItem alloc] initWithCustomView:backButton] animated:NO];


    UIButton *selectButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [selectButton setTitle:@"Select" forState:UIControlStateNormal];
    [selectButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    selectButton.frame = someFrame;
    [selectButton addTarget:self action:@selector(sendContent) forControlEvents:UIControlEventTouchUpInside];
    [self.navigationItem setRightBarButtonItem:[[UIBarButtonItem alloc] initWithCustomView:selectButton] animated:NO];
}

既然导航项是在 viewDidLoad 方法中设置的,为什么我从另一个视图控制器返回时看不到它们(但它们仍然起作用)?

【问题讨论】:

  • 如果把调用setupModalNavigationBar的那一行注释掉,能正常工作吗?
  • 是的,我试过了,在 setupModalNavigationBar 方法中没有导航栏自定义的情况下效果很好,有没有用代码自定义它,没有这些错误?我正在考虑使用背景图片,看看问题是否仍然存在@rdelmar

标签: ios objective-c cocoa-touch uiviewcontroller


【解决方案1】:

这似乎是一种过于复杂的方法。

您为什么不创建自己的按钮,然后使用 UINavigationBar 中的 setRightBarButtonItems:items: 方法来设置您想要的按钮?

我猜它们会消失是因为您将它们添加到 UINavigationBar 的图层中。

不过,如果您想将此方法与图层一起保留,您可能需要在 viewWillAppear 方法中添加它们,但您可能需要调用 removeFromSuperlayer 以确保您不会多次添加内容。

希望这会有所帮助。

【讨论】:

  • 我将按钮添加到 self.navigationItem,而不是图层,如上面的代码所示。嗯.. viewDidAppear 使栏按钮项目出现有点太晚了。
  • 抱歉,没有正确阅读。你试过 [self.navigationController.navigationItem setRightBarButtonItem:[[UIBarButtonItem alloc] initWithCustomView:selectButton] animated:NO];此外,如果这不起作用,请尝试使用 viewWillAppear,而不是 viewDidAppear。
  • 好的,对不起,我想我读错了,我的错,会检查一下。感谢您的帮助!
【解决方案2】:

问题是:

  • 导航栏的渐变(由代码完成)

解决办法是:

  • 使用 Sketch 创建渐变图像并使用外观代理将图像设置为背景图像

    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"NavigationBarBackground"] forBarMetrics:UIBarMetricsDefault];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 2013-01-08
    相关资源
    最近更新 更多