2012-07-10 50 views
0

當我遇到一些錯誤時,我正在構建一個應用程序。在做了一些研究之後,我發現原因是因爲我正在處理2個文件,每個文件都是#import。我讀到了解決這個問題的方法是使用前向聲明,但我無法找到一個很好的例子來說明這是如何實現的。轉發聲明

這是我的。

RootViewController.h

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

@protocol SubstitutableDetailViewController 
- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem; 
- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem; 
@end 


@interface RootViewController : UITableViewController <UISplitViewControllerDelegate, FirstDetailViewControllerDelegate>{ 

    UISplitViewController *splitViewController; 

    UIPopoverController *popoverController;  
    UIBarButtonItem *rootPopoverButtonItem; 

    NSMutableArray *logMessages; 
} 

@property (nonatomic, assign) IBOutlet UISplitViewController *splitViewController; 

@property (nonatomic, retain) UIPopoverController *popoverController; 
@property (nonatomic, retain) UIBarButtonItem *rootPopoverButtonItem; 

@end 

FirstViewDetailController.h

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

//test2 
@protocol FirstDetailViewControllerDelegate <NSObject> 
- (void)addItemViewController:(FirstDetailViewController *)controller didFinishEnteringItem:(NSString *)item; 
@end 
//end test2 

@interface FirstDetailViewController : UIViewController <SubstitutableDetailViewController> { 

    //for the output 
    IBOutlet UITextView *outputView; 

    UIToolbar *navigationBar; 

} 

@property (nonatomic, retain) IBOutlet UIToolbar *navigationBar; 

//test 
@property(nonatomic, retain) NSString *message; 
//end test 

@property (nonatomic, retain) id <FirstDetailViewControllerDelegate> delegate; 

@end 

我知道,我需要更換#import@class,但我做了兩次出現?另外,我已經在RootViewController.m文件中使用了#import "FirstDetailViewController.h",那麼我還需要在那裏切換它嗎?

我有點困惑,所以任何幫助將不勝感激!

回答

1

前向聲明是解決方案,如果它只是你需要的指針,但是你在每個類中實現另一個頭的協議。

我的建議是在其他頭文件中聲明你的協議,例如MyProtocols.h,並將它包含在你的兩個.h文件中而不是控制器的頭文件中。

在一個側面說明,具有雄厚的實力,或保留引用一個人的代表是不是真的標準的做法,因爲這很容易引起保持週期從而導致泄漏的內存

+0

我在執行協議的原因是因爲我想從一個類值傳遞給另一個。我在[THIS](http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers)問題中的第一個答案,因爲顯然這是做到這一點的正確方法。 – BloonsTowerDefence 2012-07-10 18:58:15

+0

這就是一切都好,你只需要將協議聲明移動到一個新的文件 – 2012-07-10 19:00:05

+0

好棒,感謝您的幫助 – BloonsTowerDefence 2012-07-10 19:18:33

1

更換

#import "FirstDetailViewController.h"

@class FirstDetailViewController;


更換

#import "RootViewController.h"

@class RootViewController;


在RootViewController.m

,請確保您有

#import "RootViewController.h" 

#import "FirstDetailViewController.h" 

在FirstDetailViewController.h

請確保您有

#import "FirstDetailViewController.h" 

#import "RootViewController.h" 

編輯:哎呀錯過了協議引用...空間Dan F的答案是正確

+0

編譯器需要了解每個類正在實現的協議,而不是每個類本身的存在 – 2012-07-10 18:59:44