iOS与ViewController之间的iOS通信

时间:2012-05-27 16:58:01

标签: ios model-view-controller

我正在开发一个基于Apple提供的Master-View模板的应用程序(它由两个ViewControllers,MasterViewController和DetailViewController组成)。我添加了一个Model来与我的服务器进行通信。

但是,当我的Model从服务器收到消息时,它需要调用MasterViewController或DetailViewController类中的方法。我怎么能这样做?

非常感谢所有帮助。

4 个答案:

答案 0 :(得分:3)

您可以从模型中触发通知,这些通知由Master和Detail View控制器处理。

在模型中:

- (void)receivedMessageFromServer {
    // Fire the notification
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ReceivedData" 
                                                        object:nil];   
}

在视图控制器中处理“ReceivedData”通知:

- (void)viewDidLoad {
    [NSNotificationCenter defaultCenter] addObserver:self 
                                            selector:@selector(receivedDataNotification:) 
                                                name:@"ReceivedData" 
                                              object:nil];
}

- (void)receivedDataNotification:(id)object {
    NSLog(@"Received Data!");
}

答案 1 :(得分:3)

实际上MVC pattern that Apple proposes允许从模型到控制器的通知。

实现这一目标的一个好方法可能是在数据发生变化时通过NSNotification传递NSNotificationCenter个对象,并提供有关更改内容的信息,并让听众负责处理。

答案 2 :(得分:2)

您应该使用可选的协议委托方法。我有一个答案,例如如何在PO中设置委托方法。

答案 3 :(得分:1)

阻挡是可行的方法。

您需要在ViewController中引用模型。当您想要更新数据时,您向模型发送消息并将块作为参数传递给它,当从服务器收到响应时将调用该块。

例如:

查看控制器

[self.model fetchDataFromRemoteWithCompletionHandler:^(id responseObject, NSError *error)
{
    // responseObject is the Server Response
    // error - Any Network error
}];

<强>模型

-(void)fetchDataFromRemoteWithCompletionHandler:(void(^)(id, NSError*))onComplete
{
    // Make Network Calls
    // Process Response
    // Return data back through block
    onComplete(foobarResponse, error);
}