我有以下课程设计:
继承自NSobject的控制器类和模型类;
具有来自控制器的IBoutlet的UI;
一个模型类,它扫描一组文件的属性并写入文件(使用循环);
UI必须显示正在扫描的当前文件的名称。
如何让模型类与控制器通信?
我在控制器内部创建了一个模型对象,以避免圆形,我无法在模型类中创建控制器实例。关于如何实现这个的任何建议?
答案 0 :(得分:2)
在模型的.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>
在控制器中.m。在控制器中实例化文件扫描程序时,需要将控制器设置为委托
fileScanner = [[FileScannerClass alloc] init];
fileScanner.delegate = self;
然后实施你说过的方法
- (void)fileScanner:(FileScannerClass *)fileScanner willScanFile:(NSString *)
{
...
// update the UI
}
答案 1 :(得分:0)
为模型提供对控制器的引用。
@class MyController
@interface MyModel:NSObject
@property (readwrite,assign) MyController *controller;
@end
并实施
#include "MyController.h"
@implementation MyModel
@synthesize controller;
-(void)somethingHappenedToMe
{
[controller updateYourself:self];
}
@end
您可以使用委托和私有方法来抽象自己,但在一天结束时,您仍然希望模型实例与您的控制器实例进行通信。