我知道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
}
答案 0 :(得分:0)
委托只是您当前要向其发送一条或多条消息的任何其他Objective-C实例。您指定的类型(id <SetDataInParent
)读取它是符合SetDataInParent
协议的任何Objective-C类型(我在代码中没有看到,但您可以在别处使用它。)< / p>
当向后“向后”时,通常在创建子视图时创建两个对象之间的委托链接。因此,在列表视图控制器创建详细视图控制器时,前者应将后者中的委托设置为self
。然后,详细视图控制器可以使用该委托指针将消息发送到列表视图控制器,直接通过例如willSetValue:
或间接(通过performSelector:withObject:
)。当使用performSelector:withObject:
时,它通常是首先在委托上调用respondsToSelector:
以确保在对象不响应该消息时不会抛出异常。