Obj-C: Где # импортировать заголовочные файлы протокола - PullRequest
1 голос
/ 19 мая 2011

В приложении для iOS я определяю свой собственный протокол для использования шаблона делегата среди моих пользовательских контроллеров представления.Какие файлы должны #import, какие другие файлы?Другими словами, в моем случае участвуют четыре файла:

  • MainViewController.h: объявляет протокол и контроллер представления, чем реализует протокол
  • MainViewController.m: реализует протоколметоды
  • SecondaryViewController.h: объявляет переменную экземпляра делегата и свойство типа id <Protocol> (с предварительным объявлением Protocol)
  • SecondaryViewController.m: использует метод протокола для делегата

Какие файлы должны #import, какие другие?Я думаю, что предварительного объявления в заголовке контроллера второго представления будет достаточно, но я получаю предупреждения / ошибки компиляции, если только второй заголовок или реализация не импортирует основной заголовок.

Ответы [ 4 ]

3 голосов
/ 19 мая 2011

SecondaryViewController.m следует #import 'MainViewController.h

2 голосов
/ 19 мая 2011

Допустим, PrimaryViewController имеет несколько делегированных методов для ответа. Затем вторичный контроллер представления должен реализовать свой делегат для его использования. Методы делегата объявлены в PrmaryViewController и определены в его классе делегата (здесь SecondaryViewController) В первичном контроллере представления вы просто объявляете делегата как,

@protocol PrimaryDelegate
@interface PrimaryViewController : NSObject
   <id>PrimaryDelegate;
@end
@protocol PrimaryDelegate
   -(void)secondaryViewControllerWantsToCallThisDelegate;
@end

Теперь, во вторичном контроллере вида просто импортируйте первичный контроллер вида,

 `#import "PrimaryViewController.h`
  @interface
  PrimaryViewController *primary;
  @end

В разделе реализации назначьте делегата для себя как,

 primary.delegate = self;

и определите метод, описанный в первичном делегате, во вторичный контроллер представления.

-(void)secondaryViewControllerWantsToCallThisDelegate{
//some method definition here
}
2 голосов
/ 19 мая 2011

SecondaryViewController.m должен импортировать заголовок, так как он использует методы протокола.

0 голосов
/ 19 декабря 2011

Это выглядит задом наперед. Для MainViewController не имеет смысла определять протокол и затем реализовывать его. Суть протокола в том, что вы определяете методы, которые кто-то еще может реализовать. Для примера посмотрите на шаблон проекта Утилиты Xcode 4.2:

// [FlipsideViewController.h]
@protocol FlipsideViewControllerDelegate
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller;
@end
@interface FlipsideViewController : UIViewController
@property (weak, nonatomic) IBOutlet id <FlipsideViewControllerDelegate> delegate;
@end

// [MainViewController.h]
#import "FlipsideViewController.h" // so that it can see the protocol definition
@interface MainViewController : UIViewController <FlipsideViewControllerDelegate>
@end

В результате MainViewController может создать экземпляр FlipsideViewController и установить себя как FlipsideViewController delegate. Теперь FlipsideViewController может общаться с MainViewController через его свойство delegate, используя методы FlipsideViewControllerDelegate, оставаясь независимым от своего реального класса.

...