2010-07-28 34 views
5

我試圖提供一個IBAction方法來實現應用程序各個部分所需的常用功能。如何將UIApplicationDelegate添加到UIResponder鏈的末尾?

即登錄有模式地實現,並且如果成功的結果的通知,允許所有加載的視圖控制器響應該事件(從匿名到認證過渡)

@interface MyAppDelegate : NSObject <UIApplicationDelegate> 
{ 
    ... 
} 
- (IBAction)loginTapped:(id)sender; 
@end 

我設置按鈕的操作到IB的第一響應者,但響應者鏈不會給予MyAppDelegate一個迴應的機會。

我的問題是,我不想在響應者鏈的各個部分複製該方法,我想將它添加到已經是子類的公共類中。

UIResponder鏈一直到UIApplication,但似乎是結束。我的UIApplicationDelegate沒有得到參與。

我想插入或添加我的應用程序委託給響應者鏈!

(或另謀出路掛鉤的UIButton潤色,裏面的應用程序內的執行情況。我想避免繼承了UITabBarControllerUIWindow如果可能的話)

回答

2

你可以繼承UIApplication到如果它是UIResponder子類,則-nextResponder返回應用程序委託。然後,您需要將您的呼叫更改爲UIApplicationMain以使用您的自定義子類。

我還沒有嘗試過這個,但我不能想到這會造成任何直接的問題。

+1

我想盡可能避免繼承任何東西。 Apple文檔指導您遠離「UIApplication」的子類化:*「很少有有效的需求來擴展這個類; ......非常確定你正在試圖用子類來完成什麼。」* – ohhorob 2010-07-30 01:55:37

0

從iOS 5開始,AppDelegate自動成爲響應者鏈中的最後一個鏈接。 Xcode項目模板將創建一個AppDelegate,它是UIResponder的子類,而不是NSObject。然而,爲了避免弄亂AppDelegate中,覆蓋的AppDelegate的nextResponder和工作卸載到自定義UIResponder對象:

- (UIResponder *)nextResponder 
{ 
    static dispatch_once_t onceToken; 
    static LastUIResponder *lastResponder = nil; 
    dispatch_once(&onceToken, ^{ 
     lastResponder = [[LastUIResponder alloc] init]; 
    }); 
    return lastResponder; 
}