2014-02-17 58 views
0

UINavigationController.h我們擁有財產申報爲使用navigationBarHidden作爲吸氣財產不給錯誤

@property(nonatomic,getter=isNavigationBarHidden) BOOL navigationBarHidden; 

它明確指出,其吸氣劑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

了關於同一些參考,但找蘋果refernces。

+0

。 navigationController類和UINavigationController在哪裏聲明瞭這個屬性,它們是相同還是不同?因爲它很有可能不是考慮你的UINavigationController,而是viewController正在考慮它的默認UINavigationController,這就是爲什麼它沒有顯示錯誤。 – Divya

+0

如果是UINavigationController,我不會創建任何子類。我正在使用現有的類 –

+1

即使您在屬性中設置了吸氣劑,仍然可以通過navigationBarHidden訪問它。 getter只是爲了改善你的類的接口的語義。爲了更好的理解。 – Divya

回答

2

問題是你混淆了財產及其獲得者和制定者。

當您使用:self.navigationController.navigationBarHidden時,您直接引用屬性,這意味着編譯器將根據「=」符號的位置查看調用getter或setter的方法。

但是當你使用[self.navigationController navigationBarHidden];你顯式調用方法命名navigationBarHidden這應該拋出一個錯誤,因爲這種方法不存在,而必須使用實際的getter名稱:如果您檢查自[self.navigationController isNavigationBarHidden];

+0

有道理可以接受,直到我得到一些蘋果引用,否則我會接受它 –

0

心動不如行動,讓BOOL財產設置爲navigationBarHidden您可以使用此代碼....

- (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; 
} 
+0

我沒有創建任何布爾屬性 –

+0

嘿,現在我有你的問題,檢查與上面更新的代碼 –

+0

你還沒有得到我的觀點。我編輯了我的問題,並且我對編譯器的簡單請求是**,請拋出一個錯誤** –

0

嘿這裏是http://rypress.com/tutorials/objective-c/properties.html類似於您的問題的例子;請看看這個:

如果你不喜歡@屬性的默認命名約定,你可以 與吸氣改變的getter/setter方法名=和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 

這些都是需要一個參數(訪問 方法名)的唯一屬性 - 所有的其他是布爾標誌。

+0

編譯器會在生成運行和isRunning之後。它使用getter = isNavigationBarHidden的慣例。它並不意味着使用getter =後,編譯器將不會生成navigationBarHidden @InderKumarRathore – morroko

+0

@Josh Caswell爲什麼你投票給我所有的答案你能解釋一下告訴我 – morroko

+0

嘿,我不是說請再次讚揚它,但告訴我,我也可以更新自己的理由。 – morroko