0

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

我最近在斯坦福的 CS193P Winter 2010 系列中观看了关于导航视图控制器等的讲座,在那次讲座中,他们讨论了在视图控制器堆栈上传递数据,这很容易。但是他们简要提到了理想情况下,您最好使用委托/协议“向后”传递数据(例如,从详细视图控制器到列表视图控制器),但他们没有进行演示或发布示例代码。

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

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
}
4

1 回答 1

0

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

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

于 2010-12-16T17:19:34.897 回答