2011-11-04 65 views
3

關於覆蓋導航控制器的後退按鈕動作有很多問題,但大家都知道沒有直接的方法來做到這一點。我通過繼承UINavigationController並重寫UINavigationBarDelegate方法來實現此目的。但問題是,UINavigationController的接口沒有實現UINavigationBarDelegate協議(但是它實現了這個方法,因爲這個代碼工作:),並且我擔心這個應用程序會被Apple拒絕,因爲這裏使用的是未公開的API。捕捉UINavigationController的本機後退按鈕動作

所以,問題是:你認爲,它是私人API使用或不?代碼如下:

@interface CustomNavigationController : UINavigationController <UINavigationBarDelegate> 

@end 

@implementation CustomNavigationController 

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item { 
    BOOL shouldPop = [[self topViewController] enableBackButton]; // every view controller overrides this method to disable or enable pop of view controller 
    if (shouldPop) { 
     //here is the warning about "UINavigationController may not respond to selector" 
     return [super navigationBar:navigationBar shouldPopItem:item]; 
    } else { 
     return NO; 
    } 
} 

@end 
+0

這是UINavigationBarDelegate的協議方法:[super navigationBar:navigationBar shouldPopItem:item]; UINavigationController不實現UINavigationBarDelegate協議。 – Mitya

回答

1

關於UINavigationController的Apple文檔:該類不適用於子類。

雖然這意圖是不是一個禁令,並可能不會在技術上讓你拒絕(使用似乎沒有引用任何私人APIs)它應該影響你的設計決定。您現在或將來可能會繼承意外行爲(如果更改了超類的內部)。導航控制器非常方便,但根據您的需要,您可能會更好地使用自己的產品。

另一種方法是使用標準的導航控制器,但將navigationBar屬性設置爲隱藏。然後,您可以在XIB中設計幷包含您自己的導航欄,並且可以使用任何針對您希望的任何操作的按鈕(例如,簡單地調用popViewController的後退按鈕)。

編輯:UINavigationController的子類化不再不鼓勵。

+0

感謝您的回答。我會考慮如何實現我自己的導航欄。 – Mitya

+0

這似乎已經發生了變化:「這個類一般按原樣使用,但可能會在iOS 6及更高版本中被分類。」剛剛從蘋果的[UINavigationController]文檔中獲取(https://developer.apple.com/library/ios/Documentation/UIKit/Reference/UINavigationController_Class/Reference/Reference.html)。 – enreas

+0

@enreas答案已更新。 – isaac

相關問題