使用navigationBarHidden作为getter属性不会给出错误

时间:2014-02-17 10:35:13

标签: ios iphone objective-c uinavigationcontroller

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;
}

知道为什么会这样吗?或者我用错误的方式解释它


修改

我在Ry’s Objective-C Tutorial - Properties

获得了相同的参考资料

但寻找苹果推荐。

3 个答案:

答案 0 :(得分:2)

问题是你要混淆财产及其吸气剂和制定者。

当您使用:self.navigationController.navigationBarHidden时,您直接引用该属性,这意味着编译器将根据" =&#的位置查看调用getter或setter的方法。 34;登录。

但是当你使用[self.navigationController navigationBarHidden];显式调用名为navigationBarHidden 的方法时,这应该抛出错误,因为这样的方法不存在,相反你必须使用实际的getter name:[self.navigationController isNavigationBarHidden];

答案 1 :(得分:0)

知道了,要获得设置为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;
}

答案 2 :(得分:0)

嘿,这里是http://rypress.com/tutorials/objective-c/properties.html的一个例子,类似于你的问题;请看一下:

  

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

@property (getter=isRunning) BOOL running;
     

生成的访问器现在称为isRunning和setRunning。注意   公共财产仍然被称为运行,这就是你   应该用于点符号:

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
     

这是唯一采用参数的属性(访问者   方法名称) - 其他所有都是布尔标志。