2011-05-17 80 views
0

如何覆蓋UINavigationController中的initWithRootViewController方法?如何覆蓋initWithRootViewController

xcode對我來說唯一的方法是在loadFromNibName和loadView等方法。這些方法不會被調用,我需要在啓動時將NSNotification添加到navigationcontroller。

我知道這看起來有點像下面的,但我不知道放什麼方法體

- (id)initWithRootViewController:(UIViewController *)rootViewController 

{ 
// what goes here? 
} 

編輯 我想真正的問題是「你怎麼自定義初始化」

編輯2

我的導航控制器頭

期間的UIViewController
@interface AccountViewNavigationController : UINavigationController { 

} 
@end 

實例化我的UINavigationController像這樣將導致沒有啓動方法打破發點

accountViewNavController = [[UINavigationController alloc] initWithRootViewController:accountView]; 

在哪裏,如果我實例,像這樣的loadView不會被調用....但它被調用無數次

accountViewNavController = [[UINavigationController alloc] init]; 

[accountViewNavController initWithRootViewController:accountView NO]; 

我對這個階段非常困惑。

+0

你爲什麼要重寫它?如果你正在使用xib,你可以簡單地將RootViewController類改爲另一個UIViewController子類 – lostInTransit 2011-05-17 11:03:20

+0

我想添加以下內容.. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveMyEvent :) name:@「MyEvent」object :零]; – dubbeat 2011-05-17 11:05:00

回答

2

使用您用於覆蓋任何其他init方法相同的基本結構:

- (id)initWithRootViewController:(UIViewController *)rootViewController 
{ 
    if ((self = [super initWithRootViewController:rootViewController])) { 
     // Your modifications go here 
    } 
    return self; 
} 

請注意,蘋果公司聲稱的UINavigationController是「不適合子類化」,但他們沒有絕對禁止它。我想這意味着「不要試圖通過搞亂內部消息流來改變類的工作方式」。

+0

嗯...我卡在那裏的一個斷點,它似乎仍然沒有進入功能? – dubbeat 2011-05-17 10:58:04

+0

@dubbeat:你確定你使用自己的子類而不是股票UINavigationController?你使用IB創建它,在這種情況下,你需要使用'awakeFromNib'或可能'initWithCoder:'?或者你可以在'viewDidLoad','viewWillAppear:'或類似的代碼中執行你的代碼嗎? – Anomie 2011-05-17 12:49:03

+0

我不確定它是否是「股票」。我沒有使用IB。在代碼中做,如果我像這樣實例化,viewDidLoad只會被調用。 accountViewNavController = [[UINavigationController alloc] init] ;. viewDidload被多次調用,這對我來說很奇怪? – dubbeat 2011-05-17 12:56:35