2013-07-09 45 views
2

知道我來自iOS背景可能會有幫助,並且這是我的第一個OS X項目。setAction:在NSViewController中

在我的項目中,我有一個NSView子類和一個NSViewController,並在控制器中加載視圖。

- (void)loadView 
{ 
    StartView *view = [StartView alloc] initWithFrame:frame]; // frame exists 
    self.view = view; 
} 

視圖有一個NSButton -property btnNew我在initWithFrame:補充。

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.btnNew = [[NSButton alloc] initWithFrame:NSRectFromCGRect(CGRectMake(350, 180, 300, 60))]; 

     [self addSubview:self.btnNew]; 
    } 

    return self; 
} 

loadView:我嘗試設置動作和目標。

- (void)loadView 
{ 
    StartView *view = [StartView alloc] initWithFrame:frame]; // frame exists 

    [view.btnNew setTarget:self]; 
    [view.btnNew setAction:@selector(createNew:)]; 

    self.view = view; 
} 

createNew:函數存在,偏離過程。

但是,當點擊按鈕時,應用程序崩潰。當我將setTarget:setAction:移動到視圖中並在self.btnNew上執行時,它可以工作,但我認爲這不是應該如何處理體面的MVC體系結構中的事件和用戶交互。

問題是self[view.btnNew setTarget:self];,我想。如果我用view.btnNew.target抓取目標,這是一個零對象(0x000 ... 000)。 Self存在& view.btnNew存在。

我做錯了什麼?或者我是否應該真的聽到視圖中的點擊並使用委託或通知(我猜不是?)

+0

引發了什麼異常,堆棧跟蹤和消息是什麼? – Wain

+0

@When 它引發了一個'NSObject不響應選擇器'異常,可能是因爲目標不知何故。 我也嘗試用[selfrespondsToSelector:]在if子句中包裝setTarget和setAction,但那是真的,所以動作仍然受到約束。 –

+0

它看起來並不像你做錯任何事情。當視圖顯示時,什麼保留了控制器? – Wain

回答

2

我自己在Niel Deckx的幫助下發現了它。

問題是ARC。 ViewController在點擊發生之前得到處理,這解釋了NSObject不會響應選擇器:目標不再存在。

簡單的解決方案是將ViewController作爲創建它的(強?)屬性。