导航栏右侧按钮未显示

6
我正在使用以下函数通过通知在我的UINavigationBar上加载一个右侧按钮,尽管我可以跟踪该按钮并验证它已分配,但它不会显示出来...有什么想法吗?
编辑4/6/2011,2:42 PM
所以,有趣的事情是...宽度总是报告为0.0...
- (void)showRightBarButton:(id)sender
{
    NSLog(@"Showing button");
    UIBarButtonItem *button = [[UIBarButtonItem alloc]
                               initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
                               target:self
                               action:@selector(showPI:)];
    [button setTitle:@"This Button"];
    self.navigationItem.rightBarButtonItem = button;
    //[[self.navigationItem rightBarButtonItem] setWidth:50];
    NSLog(@"Button width is %f.", self.navigationItem.rightBarButtonItem.width);
    [button release];
}

看起来没问题。视图控制器如何显示在屏幕上?你在那里做了什么特别的事情吗? - Johan Kool
这段代码来自我的根视图控制器,我已经将其扩展为UINavigationController。 - diatrevolo
2个回答

5
[self.view setNeedsDisplay];

你说得对。那一行不需要。至于代码的其余部分,我没有发现什么问题。到目前为止,我唯一想到的是self不是当前显示的视图控制器或者你缺少导航控制器。也许你自己创建了UINavigationBar而不是使用导航控制器?

无论如何,为了更容易调试,我建议采取以下措施:

- (void)showRightBarButton:(id)sender
{
    NSLog(@"Showing button");
    UIBarButtonItem *button = [[UIBarButtonItem alloc]
                             initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
                                                  target:self
                                                  action:@selector(showPI:)];
    self.navigationItem.rightBarButtonItem = button;
    [button release];
}

编辑: 宽度不重要。除非你手动指定,否则它始终为0.0。

问题在于,您将按钮添加到了错误的位置。您不应该将按钮添加到导航控制器的导航项中,而是添加到当前由导航控制器显示的控制器的导航项中。


嗨Erik,谢谢。所以这个方法是我的RootViewController.m的一部分,它本身是从UINavigationController继承而来,由应用程序委托直接创建,在应用程序启动时创建。 - diatrevolo
也许我应该提到我一切都是通过编程创建的。我不使用IB... - diatrevolo
@diatrevolo,请看一下我的修改。我相信它会解决你的问题。 - Erik B
非常感谢你,Erik!就是这样。非常感谢你的帮助。 - diatrevolo
@diatrevolo 不用谢。我已经获得了无名英雄徽章,所以你可以放心点赞我的回答。 ;) - Erik B

0

你说你正在使用NSNotification来触发添加bar button item。你在哪里注册通知?可能是通知在你的视图加载之前就被接收到了吗?

如果你在-init中注册通知,你可能想在你的视图控制器上设置一个标志,表示你应该显示bar button item,然后在-viewDidLoad中引用该标志以选择性地显示它。

或者你可以在-viewDidLoad中注册通知。


嗯,由于它是从UINavigationController本身继承的,因此不包含此按钮的第一个子视图肯定已经加载完毕。只为确认,将其移动到-viewDidLoad,并发生了相同的情况。感谢建议。 - diatrevolo
实际上,UIViewController并不是从UINavigationController继承而来的,相反,UINavigationController是UIViewController的子类。这是一个重要的区别需要理解。 - Mark Adams
啊,不好意思,我的自定义控制器是继承自UINavigationController的。谢谢。 - diatrevolo
1
好的。我感到有义务说,苹果明确表示在UINavigationController类参考中,它不适用于子类化。 :) - Mark Adams
哦,嗯。有趣。我没有意识到。我可以重新工作,谢谢! - diatrevolo
好的,现在从UIViewController继承,并实现了一个普通的UINavigationController。谢谢你的提示! - diatrevolo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接