2010-07-07 48 views
0

我是來自Flex/Actionscript開發的Objective-C新手。Objective-C中的Actionscript樣式事件?

我有一個名爲MyAppDelegate的UIApplicationDelegate符合委託的iPhone應用程序 - 它有一個UIWindow。

而不是直接向窗口添加按鈕,標籤和什麼東西,我想我應該爲每個屏幕製作一個UIViewController的子類。當顯示該屏幕時,我將相應控制器的視圖作爲子視圖添加到窗口中。當應該顯示另一個屏幕時,我應該彈出窗口中的任何其他視圖並添加新視圖。希望我得到了一切正確的迄今...

我的意圖是使每個視圖控制器只知道自己的事情,所以我們說我想調用視圖A從視圖B,在ActionScript中我會添加一個按鈕發射一個事件,這個事件會被視爲A的擁有對象(可能是應用程序),它可以採取適當的行動(移除視圖A,實例化視圖B並顯示它)。

如何在Objective-C中做到這一點?

+0

你描述的基本概念/模式是響應者鏈。 iOS SDK爲您實現了內部功能,允許您指定「無」目標(無目標)和控件(按鈕等)的操作。該按鈕的動作將通過響應者鏈「冒泡」,從而允許每個對象有機會處理它。 – ohhorob 2010-07-07 05:27:23

+0

謝謝。這實際上是我最終使用的答案。然而,不能「檢查」它;-) 即使這個頁面上的其他答案都是正確的,這一切都取決於應用程序和情況... 我做了什麼:在頁1的筆尖文件中,我點擊First Responder,去了「Responder Identity」並添加了一個新的動作「goPage2:」。然後,我用第一頁上的一個按鈕勾住了它。在page1控制器中,我能夠捕捉到事件。然而,我把捕捉功能移到了「父」控制器上,並且工作正常。足夠現在,我猜... – Jonny 2010-07-08 05:24:28

回答

1

甲UIControl,如UIButton的,可以具有任何數量的與註冊的事件偵聽器:

- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; 

的目標將要接收的方法的視圖控制器和動作是需要的方法調用。對於按鈕,事件通常只是UIControlEventTouchUpInside。如果目標爲零,則該事件將傳遞給響應者鏈,直到響應者實施該動作。如果你通過@selector(buttonClicked:)那麼目標應該有這樣的方法:

-(IBAction) buttonClicked:(id)sender; 

將發件人是被點擊的按鈕。 IBAction相當於一個void返回類型。如果您希望以編程方式執行此操作,則可以在Interface Builder中綁定該操作。

當另一畫面應該是 顯示,我應該爆開從窗口任何其他 視圖,並添加新的 視圖。

這基本上是正確的,但通常使用元視圖控制器(如UINavigationController)來管理視圖控制器。即使您不使用元控制器可能呈現的UI,也可以方便地爲您管理視圖切換。

+0

像你注意到的,我現在已經看到使用UINavigationController(或tab控制器)將是首選。然而,這些控制器總是(或多或少)在屏幕上保持可見,即您的頂部或底部有一個包含主導航按鈕的欄。然而,我的應用程序是一個文檔查看器,查看文檔是中心的(可能會消耗大量內存),但經過長時間的考慮,我沒有找到一個現成的控制器。文檔視圖將在第一次啓動時顯示,並且應該佔用屏幕的100%,無需導航欄。在另一個視圖上,我想完全卸載文檔視圖以節省內存。 – Jonny 2010-07-08 05:28:26

+0

使用導航控制器,使用'navigationBarHidden = YES'來隱藏導航欄。從推送的每個控制器的「viewWillAppear:」中進行設置。 – drawnonward 2010-07-08 16:57:12

+0

元視圖控制器添加和刪除它們顯示的視圖控制器的視圖。在'viewDidDisappear:'被調用後,只要你可以在'loadView'或'viewWillAppear:'中再次創建它們,你就可以自由地釋放任何視圖和其他資源。 – drawnonward 2010-07-08 17:02:01

1

如果您是來自Actionscript,您可能有興趣查看PureMVC framwork for objective C。使用PureMVC,您將爲應用程序交互創建Mediator,Commands和Models的組合。

使用PureMVC,您可以通過facade註冊通知,並且您可以在您的介體中定義偵聽器來響應這些通知。這非常接近您在Actionscript中使用的事件模型。 (在我上一份工作中,我們在UIResponder中添加了一些類別來刪除一些文件)。如果你正在創建一個相當大的應用程序,那麼我建議你看一看;它確實幫助我們保持一切可管理。

如果您不想拉入第三方庫,那麼您應該在MyAppDelegate中定義視圖操作代碼,並使用[UIApplication sharedApplication]類方法訪問全局共享實例。