2009-05-26 21 views
0

這是一個簡化:代表,插座和鼠標事件的類設計

我有一個應用程序與幾個按鈕。如果這是應用程序第一次啓動,我想做一些特殊的事情。在我的AppController類(它是NSApp的代理)中,我使用委託方法-applicationDidFinishLaunching:來執行測試。在我發現這是第一次之後,我首先想要訪問一些IBOutlets。然後,我希望能夠爲每個按鈕獲取鼠標事件,以便我可以做其他事情。

我想不出要用這些類。我想爲首次發佈創建一個新類(FirstLaunch),但我不確定從AppDelegate調用什麼。此外,要獲得鼠標事件,我不應該成爲按鈕的子類,並考慮到我有多個按鈕,我很困惑。我可以一個接一個地解決這些問題,但是把它們放在一起,讓我感到困惑。

分解,我需要訪問&操縱我在IB中設置的IBOutlets,確定何時單擊按鈕(以及單擊了哪個按鈕)。我希望能夠從另一個班級做到這一點,以免混亂AppDelegate。

感謝您的幫助!

爲了更清楚一點,我實際上想要做的是使用Matt Gemmel的MAAttachedWindow通過按鈕放置幫助泡泡。點擊按鈕後,氣泡消失,另一個放在其他地方。氣泡將附加到主窗口中的控件。

回答

0

然後,我希望能夠獲得每個按鈕的鼠標事件,以便我可以做其他事情。

不要擔心鼠標。有可能沒有一隻老鼠(想想平時很流行的平板電腦-Mac的謠言)。

我想爲第一次啓動創建一個新類(FirstLaunch),但我不確定從AppDelegate調用什麼。

你在這裏製造你自己的方法。你可能會讓它成爲單身*;然後,你將實現一個名字類似runFirstLaunchPanel:方法,這將是一個動作方法(更多關於這些一會兒):

- (IBAction) runFirstLaunchPanel:(id)sender; 

實例化對象的筆尖,那麼,從您的應用程序委託,電話作爲發件人的操作方法爲nil

將對象放入筆尖並使該方法成爲操作方法的原因是,可以很容易地將菜單項連接到它,以便用戶可以重新運行第一次啓動面板晚點。 (例如,如果它是起點窗口,則可以將新菜單項連接到此操作而不是默認菜單項。)

*是的,我看過關於單身人士的文章,我同意他們。在這樣的情況下,沒關係。

此外,爲了獲得鼠標事件,

這是考慮這個問題的錯誤的方式。你需要做的是設置你的按鈕達到發送消息到你的控制器使控制器(可能AppDelegate做點什麼。您想要按鈕發送的消息是一個操作消息。

在擁有含按鈕窗口的筆尖的對象中實現一個操作方法。在類的標題中聲明此方法,然後在IB中通過右鍵單擊控制器並將其從正確的操作方法的圓圈拖動到按鈕,將該按鈕連接到它。

這被稱爲目標 - 行動範例,它將控制器責任(做事情)從命令他們的視圖中隔離出來。因爲每個動作方法只做一件事,所以你可以有一個按鈕,一個菜單項,甚至另一個控制器(上面的應用程序委託)發送相同的動作消息,並且接收控制器不必關心哪個控件正在發送該行動,因爲它已經知道該做什麼。

我不應該是按鈕的sublass,

號你很少創建的不是NSObject的其他任何東西(或者,在覈心數據,NSManagedObject模型對象)的可可子類。

請注意,我說「很少」,而不是「從不」。你將不得不做偶爾的子類,特別是如果你想創建自定義或定製的視圖和單元格(也許,定製的窗口)。然而,子類化在可可中不是必需的達到(我聽說)它在其他平臺上的一些其他框架中的程度。

並考慮到我有多個按鈕,我很困惑。

目標動作範例意味着您不必爲每個按鈕創建一個按鈕子類。一個控制器類實現了所有的操作和股票按鈕,因爲你已經將它們連接到IB,只需告訴控制器「執行此操作」。

看,我需要訪問&操縱我在IB設置IBOutlets,

大概不會。至少,不像你想象的那麼多。

確定何時點擊按鈕(以及哪個按鈕被點擊)。

沒有。按鈕會擔心被點擊;你只需要設置它們來發送,然後迴應他們的行動信息。

2

我猜你想在第一次啓動時顯示一些額外的用戶界面?如果它是一個單獨的窗口,我建議創建一個NSWindowController的子類。將第一次運行的用戶界面的新NIB文件添加到項目中,並將文件所有者對象的類更改爲FirstLaunch。控制 - 從文件所有者代理拖動一個電線到窗口,將其與window插座連接。

通過向該類添加實例變量來創建IBOutlet s。如果您的應用程序只能在Leopard或更高版本上運行,這是更好地宣告你的店是這樣的:

@interface FirstLaunch : NSWindowController { 
    NSTextField *myTextField; 
} 

@property (nonatomic, retain) IBOutlet NSTextField *myTextField; 

@end 

在Interface Builder中,你將控制鍵拖拽文件的所有者電線到控制權交給它與關聯那個出口。確保你在你的課程的dealloc方法(如果你沒有使用垃圾回收)發佈你對每個IBOutlet的引用,否則你的應用程序將泄漏內存。

按鈕在點擊時發送操作消息,因此您需要提供按鈕調用的操作方法。你這樣做,通過聲明的方法,像這樣的簽名:

- (IBAction)myButtonClicked:(id)sender; 

在Interface Builder中,你將控制拖動從按鈕的導線到你的窗控制器與選擇myButtonClicked:方法。

爲了完成所有這些工作,您需要創建窗口控制器實例並告訴它在運行時加載NIB文件。所以,在你AppDelegate類,當你確定這是國內首家推出,你會做這樣的:

FirstLaunch *firstLaunchController = [[FirstLaunch alloc] initWithWindowNibName:@"nameOfNibFile"]; 
[firstLaunchController show:self]; 

你可能要保持參照窗口控制器的實例變量,而不是像我在這裏完成的局部變量。而且,根據您的應用程序,將其顯示爲表格可能更有意義。但是一旦你做到了這一點,你就可以自己想出如何做到這一點。

+0

這對我想要做的事情有幫助,但我已經通過編輯我的問題 進一步澄清了我的目的,不過謝謝! – Walker 2009-05-26 22:46:24