从模型访问控制器

时间:2011-08-17 13:41:12

标签: objective-c cocoa model-view-controller delegates

我有以下课程设计:

  • 继承自NSobject的控制器类和模型类;

  • 具有来自控制器的IBoutlet的UI;

  • 一个模型类,它扫描一组文件的属性并写入文件(使用循环);

  • UI必须显示正在扫描的当前文件的名称。

如何让模型类与控制器通信?

我在控制器内部创建了一个模型对象,以避免圆形,我无法在模型类中创建控制器实例。关于如何实现这个的任何建议?

2 个答案:

答案 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

您可以使用委托和私有方法来抽象自己,但在一天结束时,您仍然希望模型实例与您的控制器实例进行通信。