我有两个控制器类A和B.一个实例化几个B.当在A中按下相应的按钮时,A实例化一个B并且程序流被传递给B.在B的运行结束时我希望它通过一些数据回到A.这怎么可能?
更确切地说,我有一个NSArray of Objects,我想在B运行其最后一个方法后返回'A'...
答案 0 :(得分:3)
很多选择:
可能更多,但这些是我经常使用的。
答案 1 :(得分:1)
正如Ray所说,有很多方法,但最简单的方法是将A
的实例作为参数传递给B
的初始值设定项,然后调用A.whatever(...)
传回数据。定义和使用whatever(...)
方法作为非正式协议可能最容易 - 你知道它存在,并且两个模块知道它存在,但代码中没有任何特定的要求它存在。
如果您希望有一种方法可以声明B
需要一个对象来回调并指定该对象必须能够执行的操作,那么您可以设置一个正式的协议。这可能会说您需要一个对象,不一定是A
,而是符合MyBCallbackProtocol
的任何对象,您定义为需要具有whatever(...)
的一个实例方法。正式协议允许编译器检查您传入的对象是否肯定支持您想要的方法调用。
这种情况可能有些过分 - 但如果A
和B
之间的沟通变得更加复杂,您可能希望使用它来确保您已经实施了所有方法。我决定你需要。如果更改了A,则协议有助于确保B
仍然能够传回其信息。
如果A
和B
非常特定于您的应用,则NSNotificationCenter也可能过度。但是,它确实完全隔离B
,同时允许其他人从中获取数据;如果B
是一个可重复使用的实用程序类,那么值得考虑。
我不会在A中提到ivar;这让B的方式也参与了A的业务。
答案 2 :(得分:0)
有几种方法可以实现这一点,最简单,最快速的解决方案是使用NSNotificationCenter。使用NSNotificationCenter,您可以订阅和发送自定义通知。
NSNotificationCenter: 接收
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishParsing:) name:@"yourNoticationName" object:nil];
- (void)didFinishParsing:(NSNotification *)aNotification {...}
发送
NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"some", @"optional", @"data", @":)" nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"yourNoticationName" object:nil userInfo:userInfo];