2010-04-28 47 views
2

好的,這已被解釋了幾次(我使用this post on SO得到了大部分的方式),但我錯過了一些東西。我能夠順利地編譯,並能設置代表以及來自委託調用方法,但我對構建得到一個警告:在目標C(iPhone)中正確申報委託書

No definition of protocol 'DetailViewControllerDelegate' is found 

我有一個DetailViewController,只有RootViewController的。我從DetailViewController調用RootViewController中的方法。我已經委託設置爲這樣:

RootViewController.h

#import "DetailViewController.h" 

@interface RootViewController : UITableViewController <NSFetchedResultsControllerDelegate, DetailViewControllerDelegate> //Error shows up here 
{ 
//Some Stuff Here 
} 
//Some other stuff here 
@end 

RootViewController.m我定義的委託,當我創建使用detailViewController.delegate = self

認爲在DetailViewController.h

@protocol DetailViewControllerDelegate; 

#import "RootViewController.h" 

@interface DetailViewController : UITableViewController <UITextFieldDelegate> 
{ 
    id <DetailViewControllerDelegate> delegate; 
} 

@property (nonatomic, assign) id <DetailViewControllerDelegate> delegate; 

@end 

@protocol DetailViewControllerDelegate 

//some methods that reside in RootViewController.m 

@end 

我覺得在DetailViewController.h以上的協議上面聲明的協議很奇怪,但如果我不它不會建立。就像我說的那樣,這些方法被稱爲罰款,並且沒有其他錯誤發生。我在這裏錯過了什麼?

回答

3

pheelicks是非常有,但它看起來像你的一些協議方法也使用DetailViewController類,我想它看起來是這樣的:

@protocol DetailViewControllerDelegate <NSObject> 
- (void) controller:(DetailViewController *)controller hasSomething:(id)thing; 
@end 

@class DetailViewController : UITableViewController <UITextFieldDelegate> { 
    id <DetailViewControllerDelegate> delegate; 
} 
@property (nonatomic, assign) id <DetailViewControllerDelegate> delegate; 
@end 

而且您還沒有定義DetailViewController,所以您將在協議定義中出現錯誤。

您可以通過兩種方式解決這個問題:

a)宣佈(但不要協議

@class DetailViewController; 

@protocol DetailViewControllerDelegate <NSObject> 
- (void) controller:(DetailViewController *)controller hasSomething:(id)thing; 
@end 

B之前還沒有定義)的類)就在你的協議使用UITableViewController代替DetailViewController方法。

@protocol DetailViewControllerDelegate <NSObject> 
- (void) controller:(UITableViewController *)controller hasSomething:(id)thing; 
@end 

就我個人而言,我選擇解決方案(一),但它確實取決於你想要做的。

希望有所幫助。

+0

我選擇瞭解決方案(a)。它效果很好。非常感謝。 – 2010-04-29 15:05:01

0

嘗試:

在DetailViewController.h:

#import "RootViewController.h"  

@protocol DetailViewControllerDelegate <NSObject> 

//some methods that reside in RootViewController.m 

@end 

@interface DetailViewController : UITableViewController <UITextFieldDelegate> 
{ 
    id <DetailViewControllerDelegate> delegate; 
} 

@property (nonatomic, assign) id <DetailViewControllerDelegate> delegate; 

@end 
+0

當我這樣做時,我最終在構建方法中出現錯誤。所以我在'DetailViewController'之前得到'Expected')。該方法沒有任何錯別字。 -EDIT TO ADD- 它雖然擺脫了警告。 – 2010-04-28 17:31:11

+0

嘗試將導入移到協議之前(請參閱更新的答案) – pheelicks 2010-04-29 08:25:09

0

這是另一種解決方法,類似於deanWombourne提出的解決方案。

@protocol DetailViewControllerDelegate; 

@interface DetailViewController : UITableViewController <UITextFieldDelegate> { 
    id <DetailViewControllerDelegate> delegate; 
} 

@property (nonatomic, assign) id <DetailViewControllerDelegate> delegate; 

@end 

@protocol DetailViewControllerDelegate <NSObject> 
- (void) controller:(DetailViewController *)controller hasSomething:(id)thing; 
@end