UIViewController вызывает делегата друг друга - PullRequest
2 голосов
/ 22 мая 2011

У меня есть два UIViewController, каждый имеет свой делегат и вызывает один или другой.Один класс называется TopicViewController, а другой - MentionViewController, код выглядит примерно так:

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
#import <RestKit/RestKit.h>
#import "Message.h"
#import "Imgur.h"
#import "URLViewController.h"
#import "CVore.h"
#import "NSData+Base64.h"
#import "Imgur.h"
#import "ProfileViewController.h"
#import "OptionsViewController.h"
#import "Three20/Three20.h"


@class DetailViewController;
@class MentionViewController;

@protocol DetailViewControllerDelegate

- (void) viewController:(DetailViewController*)viewCon withText:(NSString *) text;

@end


@interface DetailViewController : UIViewController <MentionViewControllerDelegate>


///////////////////////////////////////////////////////////////////////////////////

#import <UIKit/UIKit.h>
#import <RestKit/RestKit.h>
#import "Members.h"
#import "DetailViewController.h"
#import "Three20/Three20.h"

@class MentionViewController;

@protocol MentionViewControllerDelegate

- (void) viewController:(MentionViewController*)viewCon withUsername:(NSString *) text;

@end


@interface MentionViewController : UITableViewController <DetailViewControllerDelegate>

Теперь проблема в том, что когда я добавляю #import "MentionViewController.h" в DetailViewController, он дает мнеследующая ошибка в MentioViewController:

Cannot find protocol declaration for DetailViewControllerDelegate.

Я понимаю, что это может быть связано с циклическими ссылками, но как мне решить эту проблему?

Ответы [ 3 ]

9 голосов
/ 22 мая 2011

Это действительно странно.MentionViewController нужен файл заголовка DetailViewController, а DetailViewController нужен файл заголовка MentionViewController.It is a cycle.Может быть, вам нужно создать пустой заголовочный файл и поместить в него весь протокол.Например,

MyProtocol.h

@class DetailViewController;
@class MentionViewController;

@protocol DetailViewControllerDelegate

- (void) viewController:(DetailViewController*)viewCon withText:(NSString *) text;

@end

@protocol MentionViewControllerDelegate

- (void) viewController:(MentionViewController*)viewCon withUsername:(NSString *) text;

@end

И добавьте #import MyProtocol.h внутри DetailViewController.h и MentionViewController.h.

5 голосов
/ 22 мая 2011

Вам нужно использовать предварительное объявление для протоколов и импортировать только заголовки в файле реализации.

1 голос
/ 22 мая 2011

Я думаю, что ваша интуиция верна.

Вы должны быть в состоянии решить эту проблему, объявив 2 протокола в своем собственном заголовочном файле, а затем импортируйте этот файл из своих файлов .m. Это нарушит цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...