2014-12-08 114 views
2

我在.h文件中聲明的enum如下:枚舉的委託方法聲明

typedef enum { 
    item1 = 0, 
    item2, 
    item3 
} myEnum; 

我想在一個視圖控制器使用它在一個委託方法簽名如下:

@protocol myClassDelegate <NSObject> 
- (void)myDelegateMethod:(enum myEnum)type; 
@end 

我在這個視圖控制器類中包含了.h文件。

創建上述協議時,自動完成不會提示枚舉,編譯器也會抱怨。

它可以正常使用int而不是簽名中的枚舉。但是,我想知道是否有/使用枚舉的方式,或者如果我做錯了什麼。

我已經經歷了很多帖子,但都是正常的方法。

編輯:

ViewControllerA.h

#import <UIKit/UIKit.h> 
#import "ViewControllerB.h" 

typedef enum { 
    item1 = 0, 
    item2, 
    item3 
} myEnum; 

@interface ViewControllerA : UIViewController <myClassDelegate> 

@end 

ViewControllerB.h

#import <UIKit/UIKit.h> 
#import "ViewControllerA.h" 

@protocol myClassDelegate <NSObject> 
- (void)myDelegateMethod:(enum myEnum)type; // Autocomplete does not suggest the enums 
              // Also, x-code gives warning: Declaration of 'enum myEnum' will not be visible outside of this functio 
@end 

@interface ViewControllerB : UITableViewController 
@property (nonatomic, strong) id<myClassDelegate> delegate; 
@end 
+0

將'(enum myEnum)type'更改爲'(myEnum)type'適用於我。 – gabbler 2014-12-08 09:38:51

+0

已經嘗試過,沒有工作。你是否使用它來進行委託方法聲明? – kRiZ 2014-12-08 09:44:07

+0

對不起,我沒有將它用於委託方法,稍後會嘗試。 – gabbler 2014-12-08 09:45:06

回答

2

你有一個圓形頭部依賴性(ViewControllerA.h進口ViewControllerB.h反之亦然)。

移動enum聲明到一個共同的頭文件,並導入無論它的需要:

CommonTypes.h:

typedef enum { 
    item1, 
    item2, 
    item3 
} MyEnum; 

ViewControllerA.h:

#import <UIKit/UIKit.h> 
#import "ViewControllerB.h" 

@interface ViewControllerA : UIViewController <myClassDelegate> 
// I assume there is a reference to ViewControllerB here somewhere? 
@end 

ViewControllerB.h:

#import <UIKit/UIKit.h> 
#import "CommonTypes.h" 

@protocol myClassDelegate <NSObject> 
- (void)myDelegateMethod:(MyEnum)type; 
@end 

@interface ViewControllerB : UITableViewController 
@property (nonatomic, strong) id<myClassDelegate> delegate; 
@end 
+1

雖然這可能「解決」了問題,但我不認爲將與該類明確關聯的枚舉(假設是這種情況)分隔爲「常見類型」頭是個好主意。這是一種解決方法,而不是解決方法。 - 如果循環依賴是問題,請使用前向類聲明。 – KerrM 2014-12-08 11:13:27

+0

@KerrM從這個問題來看,並不清楚'enum'與視圖控制器有多麼緊密的關聯。如果它不是* app global *,那麼頭文件名應該使用更具體的名稱。然而,我不可能知道這種或那種方式。 – Droppy 2014-12-08 11:15:13

+0

枚舉與視圖控制器類 – kRiZ 2014-12-08 20:24:58

1

Here是一個演示您的視圖控制器結構,它爲我工作的例子。

+0

相關不是一個現實的答案,因爲問題與頭文件中的循環依賴關係有關;避免頭文件完全避免了這個問題。 – Droppy 2014-12-08 11:26:31

+0

我聽說Xcode可以解決頭文件和項目中的循環依賴項,我在'ViewControllerB'的實現文件中執行'#import「ViewControllerA.h」'。 – gabbler 2014-12-08 11:30:23

+0

它不會使用前向類/協議聲明(即'@class SomeOtherClass;')。你不能通過'#import'來完成。 – Droppy 2014-12-08 11:32:16