2011-08-08 57 views
1

我需要爲我的所有UIViewControllers附加一個方法。該方法只是返回一個指向我的主應用程序委託類對象的指針。但是,xcode 4在聲明輸出參數類型爲MyAppDelegate的頭文件中引發錯誤「解析期望的類型」。如果我將其更改爲其他類型,例如id,則錯誤消失。但是我使用點語法來訪問主應用程序委託屬性,如果我將該類型更改爲ID,則xcode4無法識別我的主應用程序委託屬性。我已經將類的定義文件包含到了我訪問此方法的那些UIViewController類文件中。這裏是我的類定義:訪問鏈式方法時,類別是否允許使用點語法?

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 
#import "MyAppDelegate.h" 

@interface UIViewController (MyCategory) 

-(MyAppDelegate *) appDelegate; // xcode 4 complains about MyAppDelegate type, though it autocompletes it and show even in green color. 

@end 

這裏是一個實現:

#import "MyCategory.h" 

@implementation UIViewController (MyCategory) 

-(MyAppDelegate *)appDelegate{ 
    MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    return delegate; 
} 

編輯:爲什麼我採取這一類的原因是,我需要有方便快捷的訪問我的主要的應用程序從代碼的任何地方委託(在我的情況下,從UIViewControler對象):

// handy shortcut :) 
self.appDelegate.someMethod; 

//not so handy shortcut :(
MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
+1

如何聲明MyAppDelegate? –

+0

@interface MyAppDelegate:NSObject 。它只是實現UIApplicationDelegate協議。 – Centurion

+0

然後嘗試'id delegate = ...'來代替。 –

回答

1

我認爲你的頭文件中有一個依賴週期。如果MyAppDelegate.h直接或間接導入MyCategory.h,則第一次編譯類別聲明時,編譯器將不知道MyAppDelegate是什麼。你應該從MyCategory.h頭去除MyAppDelegate.h進口和使用正向類聲明替換爲:

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

@class MyAppDelegate 

@interface UIViewController (MyCategory) 

-(MyAppDelegate *) appDelegate; 

@end 

然後把進口的.m文件,而不是。這實際上是一個很好的總體原則。在可能的情況下,在頭文件中使用前向類聲明,並將導入放入實現文件中。

+0

謝謝你的回答。 – Centurion

1
-(id)appDelegate{ 
    return [[UIApplication sharedApplication] delegate]; 
} 

//Calling code 
MyAppDelegate* delegate = (MyAppDelegate*)[self appDelegate]; 
+0

用於清潔設計。如果你指出爲什麼在高級框架類中包含這樣的本地化方法簽名是一個壞主意,那將會更好。 – Perception

+0

我把它放到一個類別的東西,因爲我想有一個方便的快捷方式,而不是長長的代碼行。我試圖擁有的快捷方式會表現得像一個屬性,但它只是一種方法。在我的情況下,我想訪問我的主要應用程序委託像self.appDelegate.someProperty。 – Centurion

+0

@Perception:它是如何幹淨的設計必須投入類型? – JeremyP

0

添加@class MyAppDelegate;到你的類別頭部的頂部,讓編譯器知道這個類別存在或其頭部爲#import

通常,在MyAppDelegate中使用類方法可能會更好。從概念上講,appDelegate不是您的方法暗示的單個視圖控制器的屬性。

+0

我正在嘗試改進我的架構。我的應用程序有6個UIViewController屏幕,每個MVC在屏幕上執行彈出/推送其他MVC。我需要指向每個UIViewController的所有MVC。但我不喜歡指針解決方案。我也不喜歡使用通知的想法。然後我得到一個建議,讓主要應用程序委託類中的所有必要指針都顯示在我的屏幕上,並使用sharedApplication訪問它們。但訪問代碼很長,所以我想有一個快捷方式,比如self.appDelegate.someMyUIViewController。但無法使其與類別合作。 – Centurion

相關問題