知道我來自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
存在。
我做錯了什麼?或者我是否應該真的聽到視圖中的點擊並使用委託或通知(我猜不是?)
引發了什麼異常,堆棧跟蹤和消息是什麼? – Wain
@When 它引發了一個'NSObject不響應選擇器'異常,可能是因爲目標不知何故。 我也嘗試用[selfrespondsToSelector:]在if子句中包裝setTarget和setAction,但那是真的,所以動作仍然受到約束。 –
它看起來並不像你做錯任何事情。當視圖顯示時,什麼保留了控制器? – Wain