采用课程目标c时“找不到......的协议声明”

时间:2010-12-18 17:07:20

标签: objective-c delegates protocols

目前,我在Objective-c中使用自定义委托流程感到有点沮丧。我已经使用过几次设计模式,对它的工作方式有了很好的理解。我在互联网上搜索了2个小时试图找到我在这种情况下做错了什么,并且没有占上风。我还比较了我过去使用的正常运行的自定义委托与此实例的比较,并且看不出任何概念上的差异。所以我们走了:

我正在创建一个自定义的双表视图(一个表用于列表,另一个表用于保存从该列表中选择的。)以便用户可以进行基本选择。这是头文件:

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


@protocol ListSelectorViewDelegate

-(void) listTableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
-(void) selectTableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

-(void) listTableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath;
-(void) selectTableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath;

- (void)listTableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
- (void)selectTableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;

@end


@protocol ListSelectorDataSource

-(UITableViewCell *)listTableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
-(UITableViewCell *)selectTableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

-(NSArray *)sectionIndexTitlesForListTableView:(UITableView *)tableView editStatus:(BOOL) status;
-(NSArray *)sectionIndexTitlesForSelectTableView:(UITableView *)tableView editStatus:(BOOL) status;

-(NSInteger)listTableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index;
-(NSInteger)selectTableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index;

@end

@interface ListSelectorViewController : UIViewController {

 //Delegate
 id <ListSelectorViewDelegate> listsDelegate;
 id <ListSelectorDataSource> listsDataSource;

 //Titles
 IBOutlet UINavigationBar *pageNavBar;
 IBOutlet UINavigationBar *selectNavBar;
 IBOutlet UINavigationBar *listNavBar;

 //Tables
 IBOutlet UITableView *selectTable;
 IBOutlet UITableView *listTable;

 //Table Data
 NSMutableArray *listItems;
 NSMutableArray *selectItems;

 //Search Bars
 IBOutlet UISearchBar *selectedSearch;
 IBOutlet UISearchBar *listSearch;
 BOOL listTableIsSearching;
 BOOL selectTableIsSearching;

}

@property(nonatomic,assign) id <ListSelectorViewDelegate> listsDelegate;
@property(nonatomic,assign) id <ListSelectorDataSource> listsDataSource;


-(IBAction) newItem:(id)sender;
-(IBAction) selectAll:(id)sender;
-(IBAction) clearSelections:(id)sender;

@end

注意正式的协议声明。另请注意,这与.m文件一起编译正常。当我尝试编写一个类来采用协议时,我得到错误“无法找到”ListSelectorDataSoure“”的协议声明。我也得到了“ListSelectorViewDelegate”的相同消息。这是委托类的.h文件:

#import <Foundation/Foundation.h>
#import"ListSelectorViewController.h"

@interface ListSelectorDelegateTemplate : NSObject 
 <ListSelectorDataSource,ListSelectorViewDelegate>{

}

@end

请注意,我正在导入ListSelectorViewController.h,其中找到了协议声明。另请注意,在键入“”时,它会自动完成,这意味着它确实可以看到它。就像我说的那样,我已经完成了其他对象的确切方式,没有任何问题,也无法绕过这一个...任何帮助都将非常感激

7 个答案:

答案 0 :(得分:8)

好的想通了....这里非常愚蠢的答案......

我最初在一个单独的项目中创建了ListSelectorViewController并将其添加到我正在处理的当前项目中...由于某种原因,.h和.m对于项目的其余部分是不可见的并且是错误。只需将新文件添加到项目中并复制原始类的内容即可。

答案 1 :(得分:5)

今天也遇到了这个问题。这确实是一个xcode错误。

我的委托协议文件被git merge conflict修改,我修复了冲突,但是我使用这个委托的所有文件仍然找不到这个委托协议文件。

所以我通过引用删除这两个文件,并再次将它们添加到项目中。它有效!

答案 2 :(得分:2)

如果ListSelectorViewController.h也导入ListSelectorDelegateTemplate.h,你会收到类似的错误。您应该将任何可以导入的内容移动到“.m”文件中,并在必要时将其替换为@class声明。

答案 3 :(得分:0)

今天遇到同样的问题。这似乎是一个xcode错误。

无论如何,我的解决方案是创建一个空的h。文件,在那里声明我的协议,然后#import这个新的h。在任何我使用它的地方存档。

答案 4 :(得分:0)

您已将我的协议声明放在单独的文件中,然后将其导入

答案 5 :(得分:0)

对我有用的是简单清理项目(shift + command + K)。

答案 6 :(得分:0)

在我的情况下,错误是由循环#import引起的。委托协议声明文件包含委托的实现者。实现者包括委托协议声明文件。