【问题标题】:Using navigationBarHidden as getter property is not giving error使用 navigationBarHidden 作为 getter 属性不会出错
【发布时间】:2014-02-17 10:35:13
【问题描述】:

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 得到了一些相同的参考

但正在寻找苹果参考。

【问题讨论】:

  • 如果你检查 self.navigationController 类和你声明这个属性的 UINavigationController ,它们是相同的还是不同的???因为很有可能 viewController 没有考虑你的 UINavigationController,而是考虑了它的默认 UINavigationController,这就是它没有显示错误的原因。
  • 如果 UINavigationController.我正在使用现有的类
  • 即使你在你的属性中设置了一个getter,你仍然可以通过navigationBarHidden访问它。指定 getter 只是为了改进类接口的语义。为了更好地理解。
  • 这是有道理的,Divya。感谢您的回复。

标签: ios iphone objective-c uinavigationcontroller


【解决方案1】:

问题在于您混淆了属性及其 getter 和 setter。

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

但是当你使用[self.navigationController navigationBarHidden];时,你显式调用了名为navigationBarHidden的方法这应该会抛出一个错误,因为这样的方法不存在,你必须使用实际的getter名称:@ 987654324@

【讨论】:

  • 有意义会接受,直到我得到一些苹果参考,否则我会接受它
【解决方案2】:

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

【讨论】:

  • 我没有创建任何 BOOL 属性
  • 你还是没明白我的意思。我已经编辑了我的问题,我对编译器的简单要求是请抛出错误
【解决方案3】:

嘿,这是来自http://rypress.com/tutorials/objective-c/properties.html 的一个示例,与您的问题类似;请看看这个:

如果您不喜欢 @property 的默认命名约定,您可以 使用 getter= 和 setter= 更改 getter/setter 方法名称 属性。一个常见的用例是布尔属性,其 getter 通常以 is 为前缀。尝试更改属性 在 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

这些是唯一带参数的属性(访问器 方法名)——所有其他都是布尔标志。

【讨论】:

  • 编译器会同时生成 running 和 isRunning after。它是使用getter=isNavigationBarHidden的约定。这并不意味着使用getter=之后,编译器将不会生成navigationBarHidden @InderKumarRathore
  • @Josh Caswell 为什么你对我的所有答案都投了反对票,你能解释一下告诉我
  • 嘿,我不是说请再次投票,而是告诉我为什么我也可以更新自己。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多