Доступ к контроллеру из модели - PullRequest
0 голосов
/ 17 августа 2011

У меня есть следующий дизайн класса:

  • Класс контроллера и класс модели оба унаследованы от NSobject;

  • Пользовательский интерфейс, который имеетIBoutlets от контроллера;

  • Класс модели, который сканирует набор файлов на предмет их свойств и записывает в файл (используя цикл);

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

Как я могу заставить класс модели взаимодействовать с контроллером?

Я создал объект модели внутри контроллера, чтобы избежать округлости, я не могу создать экземплярконтроллера внутри модельного класса.Любые предложения о том, как это реализовать?

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

Определите протокол в .h модели примерно так:

@protocol FileScannerDelegate
@required
    - (void)fileScanner:(FileScannerClass *)fileScanner willScanFile:(NSString *);
@end

Добавьте новое свойство assign для хранения ссылки на делегата. Это должно быть назначено, чтобы избежать циклической ссылки

@property (nonatomic, assign) id<FileScannerDelegate> delegate;

В модели .m в точке, где вы сканируете следующий файл, который вы называете

[delegate fileScanner:self willScanFile:fileName];

В .h контроллера нужно сказать, что вы следуете протоколу

@interface MyController : UIViewController <FileScannerDelegate> 

В контроллере .м. Когда вы запускаете сканер файлов в вашем контроллере, вам нужно установить контроллер в качестве делегата

fileScanner = [[FileScannerClass alloc] init];
fileScanner.delegate = self;

Затем реализуйте метод, который вы сказали, что вы бы

- (void)fileScanner:(FileScannerClass *)fileScanner willScanFile:(NSString *)
{
   ...
   // update the UI
} 
0 голосов
/ 17 августа 2011

Предоставьте модели ссылку на контроллер.

@class MyController

@interface MyModel:NSObject

@property (readwrite,assign) MyController *controller;

@end

и реализуйте

#include "MyController.h"    

@implementation MyModel

@synthesize controller;

-(void)somethingHappenedToMe
 {
      [controller updateYourself:self];
 }


@end

Вы можете абстрагироваться от wazoo с помощью делегатов и частных методов, но в концедень, когда вы все еще хотите, чтобы ваш экземпляр модели говорил с вашим экземпляром контроллера.

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