Ios 使用navigationBarHidden作为getter属性未给出错误消息

Ios 使用navigationBarHidden作为getter属性未给出错误消息,ios,iphone,objective-c,uinavigationcontroller,Ios,Iphone,Objective C,Uinavigationcontroller,在UINavigationController.h中,我们将属性声明为 @property(nonatomic,getter=isNavigationBarHidden) BOOL navigationBarHidden; 它清楚地表明它的getter是isNavigationBarHidden,但我不知道为什么我能够通过navigationBarHidden访问它 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:an

UINavigationController.h
中,我们将属性声明为

@property(nonatomic,getter=isNavigationBarHidden) BOOL navigationBarHidden;
它清楚地表明它的getter是
isNavigationBarHidden
,但我不知道为什么我能够通过
navigationBarHidden
访问它

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];

  self.navigationController.navigationBarHidden = YES;

  //Shold throw an error here but it compiles
  BOOL value = self.navigationController.navigationBarHidden;
}
知道为什么会这样吗?或者我用错误的方式解释它


编辑

我在网站上得到了一些关于这方面的参考资料


但是正在寻找苹果的参考资料。

明白了,要获取设置为navigationBarHidden的BOOL属性,您可以使用以下代码

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];

  self.navigationController.navigationBarHidden = YES;

  //Use this line to know Navigation Bar is hidden or not.... 
  BOOL value = self.navigationController.isNavigationBarHidden;
}

嘿,这里有一个与你的问题类似的例子;请看一下这个:

如果您不喜欢@property的默认命名约定,您可以 使用getter=和setter更改getter/setter方法名称= 属性。这方面的一个常见用例是布尔属性,其 getter通常以is作为前缀。尝试更改属性 在Car.h中声明如下

@property (getter=isRunning) BOOL running;
生成的访问器现在称为isRunning和setRunning。注 公共属性仍然被称为running,这就是您想要的 应使用点表示法:

Car *honda = [[Car alloc] init];
honda.running = YES;                // [honda setRunning:YES]
NSLog(@"%d", honda.running);        // [honda isRunning]
NSLog(@"%d", [honda running]);      // Error: method no longer exists
这些是唯一接受参数(访问器)的属性 方法名称)-其他所有方法都是布尔标志


问题是您混淆了属性及其getter和setter

当您使用:
self.navigationController.navigationBarHidden
时,您直接引用的是属性,这意味着编译器将根据“=”符号的位置查看调用getter或setter的方法


但是当您使用
[self.navigationController navigationBarHidden]
您显式调用名为
navigationBarHidden
的方法,这将引发错误,因为这样的方法不存在,因此您必须使用实际的getter名称:
[self.navigationController isNavigationBarHidden]

我没有创建任何BOOL属性你仍然没有理解我的观点。我已经编辑了我的问题,我对编译器的简单要求是,如果您检查self.navigationController类和声明此属性的UINavigationController,请抛出一个错误,它们是相同的还是不同的???因为很有可能viewController没有考虑您的UINavigationController,而是考虑其默认的UINavigationController,这就是为什么它没有显示错误的原因。如果UINavigationController存在错误,我不会创建任何子类。我正在使用现有的类即使您在属性中设置了getter,您仍然可以通过navigationBarHidden访问它。指定getter只是为了改进类接口的语义。为了更好的理解,这是有道理的。谢谢您的回复。编译器将在之后生成running和isRunning。使用getter=isNavigationBarHidden是一种惯例,但这并不意味着在使用getter=,编译器不会生成navigationBarHidden@InderKumarRathore@JoshCaswell为什么你对我的所有答案都投反对票?你能解释一下吗?告诉我嘿,我不是说请再次投票,而是告诉我我可以更新自己的原因。有道理,我会接受,直到我得到一些苹果推荐,否则我会接受