如何使用委托在Obj-C / Cocoa中向后传递数据/向上传递视图控制器链

时间:2010-12-16 17:04:51

标签: objective-c cocoa delegates protocols viewcontroller

我知道Apple开发文档中的代表主题以及我拥有的其他书籍以及stackoverflow等资源都有很多。但我仍然没有得到它。

我最近在斯坦福大学的CS193P 2010年冬季系列中观看了导航视图控制器等的讲座,在那个讲座中,他们谈到了在一堆视图控制器上传递数据,这很容易。但是他们简单地提到你理想情况下使用委托/协议来“向后”传递数据(例如,从详细视图控制器传递到列表视图控制器),但他们没有做演示或发布示例代码。 / p>

我已经阅读并搜索了这个确切场景的示例,因此我可以围绕使用委托/协议,但无法找到它。这是我正在玩的一些伪代码。它是否应该“向后”传递数据?

myListController : UIViewController <SetDataInParent> {
 // when pushing detail controller onto stack,
 // set DetailController delegate = self
}

myDetailController : UIViewController {
//header file
@protocol SetDataInParent <NSObject>
- (void)willSetValue:(*NSString);
@end

@interface myDetailController {
id <SetDataInParent> delegate;
}
@end

// class/m file 
@implementation
@synthesize delegate;
- (void)willSetValue:(*NSString) {
// code here that would take argument
// from detail controller and set
// a value or text field to that
// argument in list controller
}
// send message to list controller class
- [delegate willSetValue:string];
@end
}

1 个答案:

答案 0 :(得分:0)

委托只是您当前要向其发送一条或多条消息的任何其他Objective-C实例。您指定的类型(id <SetDataInParent)读取它是符合SetDataInParent协议的任何Objective-C类型(我在代码中没有看到,但您可以在别处使用它。)< / p>

当向后“向后”时,通常在创建子视图时创建两个对象之间的委托链接。因此,在列表视图控制器创建详细视图控制器时,前者应将后者中的委托设置为self。然后,详细视图控制器可以使用该委托指针将消息发送到列表视图控制器,直接通过例如willSetValue:或间接(通过performSelector:withObject:)。当使用performSelector:withObject:时,它通常是首先在委托上调用respondsToSelector:以确保在对象不响应该消息时不会抛出异常。