在采用Objective-C的类中找不到协议声明...

4
我现在对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文件,其中包含协议声明。还要注意,当输入“ ”时,它会自动完成,这意味着它确实看到了它。就像我说的,我以前用完全相同的方式处理其他对象而没有任何问题,现在无法理解这个问题……非常感谢您的任何帮助。

我注意到你编译错误中的一个拼写错误:ListSelectorDataSoure。不只是这个问题吧? - user23743
谢谢您的关注,但不是那个问题。那只是我在提问时手动输入错误而不是复制/粘贴... 我还没有弄清楚为什么它无法构建。 - RBI
7个回答

8

好的,我已经弄清楚了...这里有一个极其愚蠢的答案...

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


5
今天我也遇到了这个问题,实际上这是一个xcode的错误。
我的委托协议文件被git合并冲突修改了,我解决了冲突,但是所有使用这个委托的文件仍然找不到这个委托协议文件。
所以,我通过引用删除了这两个文件,并重新将它们添加到项目中。这样就解决了问题!

2
如果ListSelectorViewController.h还导入了ListSelectorDelegateTemplate.h,就会出现上述错误。您应该将尽可能多的导入移动到“.m”文件中,并在必要时用@class声明进行替换。

谢谢您的回复。不幸的是,ListselectorViewController.h没有导入ListSelectorDelegateTemplate.h。正如您从上面的代码中所看到的,viewController.h文件的唯一导入是UIKit和Foundation库...仍然感到困惑:( - RBI

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

0

你把我的协议声明放在了单独的文件中,然后进行了导入


0

对我有效的方法是清理项目(shift+command+K),很简单。


0
今天我遇到了同样的问题。这似乎是一个Xcode的bug。
无论如何,我的解决方案是创建一个空的h文件,在那里声明我的协议,然后在任何使用它的地方#导入这个新的h文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接