【问题标题】:"Cannot find protocol declaration for ..." in adopting class objective c“找不到...的协议声明”在采用类目标 c
【发布时间】:2014-11-17 21:00:32
【问题描述】:

目前我对 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。不只是这样吗?
  • 感谢您的注意,但这只是我在我的问题中输入错误而不是复制/粘贴它......我还没有弄清楚为什么它不会构建

标签: objective-c delegates protocols


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    所以我通过引用删除了这两个文件,然后再次将它们添加到项目中。成功了!

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 感谢您的回复。不幸的是 ListselectorViewController.h 没有导入 ListSelectorDelegateTemplate.h。正如您从上面的代码中看到的,viewController.h 文件的唯一导入是 UIKit 和 Foundation 库......仍然难倒:(
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-09-20
              • 1970-01-01
              • 1970-01-01
              • 2015-12-18
              • 1970-01-01
              相关资源
              最近更新 更多