NIB 中的导航项始终为零

Posted

技术标签:

【中文标题】NIB 中的导航项始终为零【英文标题】:Navigation Item in a NIB is always nil 【发布时间】:2013-06-05 17:58:23 【问题描述】:

我在视图控制器 NIB 中设置了一个UINavigationBar,并为栏及其关联的UINavigationItem 设置了出口。在视图控制器的viewDidAppear: 中,我调试对象。导航栏设置为对象,但导航项为nil。导航栏的items 数组包含一个UINavigationItem,它指向一个有效对象。

为什么没有设置NIB中的导航项?

这是我在视图控制器中使用的代码:

@interface NKViewController ()

    IBOutlet UINavigationBar *navigationBar;
    IBOutlet UINavigationItem *navigationItem;

@end

@implementation NKViewController

- (void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];

    UINavigationItem *itemsNavigationItem = [[navigationBar items] objectAtIndex:0];
    NSLog(@"Items Navigation Item: %@", itemsNavigationItem);
    NSLog(@"ivar Navigation Item: %@", navigationItem);

@end

哪些日志:

Items Navigation Item: <UINavigationItem: 0x71a0fb0>
ivar Navigation Item: (null)

【问题讨论】:

它在 UINavigationController 中吗? @Kevin 不,它只是一个裸导航栏。 【参考方案1】:

navigationItem (已经)是UIViewController 上的(只读)属性(由_navigationItem ivar 支持),这可能是导致此问题的原因。尝试重命名该属性,它应该没问题(实际上在我的 Xcode 版本中,如果我什至尝试将其添加为插座,它会引发错误)

更新:已经用另一个名字测试过,看起来确实没问题

更多更新:这是 ivar 的名称

@interface ViewController ()

    IBOutlet UINavigationBar *navigationBar;
    IBOutlet UINavigationItem *navigationItemX;

@end

@implementation ViewController

- (void)viewDidLoad

    [super viewDidLoad];

    UINavigationItem *itemsNavigationItem = [[navigationBar items] objectAtIndex:0];
    NSLog(@"Items Navigation Item: %@", itemsNavigationItem);
    NSLog(@"ivar Navigation Item: %@", navigationItemX);


哪些日志:

Items Navigation Item: <UINavigationItem: 0x71b11c0>
ivar Navigation Item: <UINavigationItem: 0x71b11c0>

最后我们可以通过这样做看到navigationItem确实是别的东西:

NSLog(@"Items Navigation Item: %@", itemsNavigationItem);
NSLog(@"ivar Navigation Item: %@", navigationItemX);
NSLog(@"'Hidden' ivar: %@", [self valueForKey:@"navigationItem"]); // or self.navigationItem

哪些日志:

Items Navigation Item: <UINavigationItem: 0x7185190>
ivar Navigation Item: <UINavigationItem: 0x7185190>
'Hidden' ivar: <UINavigationItem: 0x759e040>

【讨论】:

对不起,我的错。我应该提到我在视图控制器中使用了一个名为 navigationItem 的裸 ivar,而不是属性。 但是您的屏幕截图显示了 2 个网点,对吗?这意味着您有两个属性(navigationBarnavigationItem)正确吗?仍然当我将navigationItem 插座与@synthesize navigationItem = navigationItem; 一起使用时,它仍然工作正常。 不,我只是将插座连接到 ivars。我用上面的视图控制器代码发布了一个编辑。 @nevanking 这是 ivar 的名称,我也可以看到将名称更改为其他名称时问题消失 -> cl.ly/image/1F3n1x071T0J 你是对的!不知道这里发生了什么,但非常感谢您的帮助。

以上是关于NIB 中的导航项始终为零的主要内容,如果未能解决你的问题,请参考以下文章

为啥 nib 文件中的 UITableViewCell(加载并添加到堆栈)在 viewDidAppear 中为零,但在 viewDidLoad 中没问题?

如何在 nib 文件中的 ios 中添加幻灯片导航

UICollectionReusableView 中的标签始终为零

文件中的 UIImage 始终为零

Android中RelativeLayout中的视图宽度和高度始终为零

.NET Compact Framework 上的 DateTime.Now 中的毫秒数始终为零?