«Не удается найти объявление протокола для ...» при принятии цели класса c - PullRequest
4 голосов
/ 18 декабря 2010

В настоящий момент я немного расстроен процессом пользовательского делегата в target-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 ]

8 голосов
/ 20 декабря 2010

Ладно, разобрался .... очень глупый ответ здесь ...

Первоначально я создал ListSelectorViewController в отдельном проекте и добавил его в текущий проект, над которым я работаю ... по какой-то причине .h и .m не были видны для остальной части проекта и были причиной ошибки. просто добавил новый файл в проект и скопировал содержимое исходного класса.

5 голосов
/ 19 октября 2012

И сегодня эта проблема тоже есть.Это действительно ошибка xcode.

мой файл протокола делегата был изменен конфликтом git merge, я исправил конфликт, но все мои файлы, использующие этот делегат, все еще не могут найти этот файл протокола делегата.

, поэтому я удаляю эти два файла по ссылке и снова добавляю их в проект.это сработало!

2 голосов
/ 19 декабря 2010

Если ListSelectorViewController.h также импортирует ListSelectorDelegateTemplate.h, вы получите подобные ошибки.Вы должны переместить любые импортируемые файлы в файл ".m" и заменить их объявлениями @class, если необходимо.

0 голосов
/ 10 июня 2013

В моем случае ошибка была вызвана циклическим #import. Файл декларации протокола делегата включает в себя разработчика делегата. Разработчик включил файл объявления протокола делегата.

0 голосов
/ 15 декабря 2012

у меня получилось просто очистить проект (shift + command + K).

0 голосов
/ 08 ноября 2012

Вы поместили мою декларацию протокола в отдельный файл и затем импортировали ее

0 голосов
/ 13 марта 2012

Сегодня такая же проблема.Похоже, это ошибка xcode.

В любом случае, мое решение было создать пустой h.файл, объявите там мой протокол, а затем #import этот новый h.файл в любом месте, где я его использовал.

...