ios – 与容器视图通信的最佳实践是什么?

ios – 与容器视图通信的最佳实践是什么?,第1张

概述我最近经常使用容器VC,我一直想知道主Vc和容器VC之间的最佳通信方式是什么.现在我正在使用通知,但我宁愿使用更好的东西.如何获取指向容器VC的指针,以便至少可以使用委托?有更好的方法吗? 容器视图控制器在其prepareForSegue:sender:方法中设置自身与嵌入式视图控制器之间的任何必要连接. 在iOS编程中,我们在视图控制器之间有这种通信方式.你可以在“Coordinating Ef 我最近经常使用容器VC,我一直想知道主Vc和容器VC之间的最佳通信方式是什么.现在我正在使用通知,但我宁愿使用更好的东西.如何获取指向容器VC的指针,以便至少可以使用委托?有更好的方法吗?解决方法 容器视图控制器在其prepareForSegue:sender:方法中设置自身与嵌入式视图控制器之间的任何必要连接.

在iOS编程中,我们在视图控制器之间有这种通信方式.你可以在“Coordinating Efforts Between View Controllers” in the *View Controller Programming Guide for iOS”阅读它.

但我认为用一个具体的例子来理解它会更容易.让我们使用适用于iPhone的Google地图应用:

我不确切知道这个应用程序是如何实现的.但是我们假设有一个顶层的AppVIEwController来管理搜索栏(在顶部)和位置栏(在底部),它在一个容器视图中嵌入了一个MapVIEwController.

视图控制器之间存在一些交互.当用户搜索时,AppVIEwController需要告诉MapVIEwController放置一些地图标记并放大其中一个.当用户点击地图标记时,MapVIEwController需要告诉AppVIEwController在底部的位置栏中显示有关该标记的信息.

所以这是模式.

首先,我们为MapVIEwController(它是嵌入式视图控制器)将发送给AppVIEwController(它是容器视图控制器)的消息定义一个协议:

@class MapMarker;@class MapVIEwController;@protocol MapVIEwControllerDelegate <NSObject>- (voID)mapVIEwController:(MapVIEwController *)mapVIEwController dIDSelectMarker:(MapMarker *)marker;@end

我们将使AppVIEwController符合此协议.因此MapVIEwController不需要专门了解AppVIEwController.它只需要引用一些符合协议的对象. MapVIEwController还需要了解设置其标记的消息以及缩放到特定标记的消息.所以我们像这样声明MapVIEwController:

@interface MapVIEwController : UIVIEwController@property (nonatomic,weak) ID<MapVIEwControllerDelegate> delegate;- (voID)setMarkers:(NSArray *)markers;- (voID)zoomToMarker:(MapMarker *)marker;@end

请注意,委托属性较弱以避免保留周期.

AppVIEwController需要符合MapVIEwControllerDelegate协议.通常我们在AppVIEwController.m中的类扩展中声明一致性,因为一致性不需要是AppVIEwController的公共接口的一部分. AppVIEwController还需要对MapVIEwController的引用.

@interface AppVIEwController () <MapVIEwControllerDelegate>@property (nonatomic,strong) MapVIEwController *mapVIEwController;@end

接下来,我们进入故事板,选择嵌入segue,并给它一个标识符:

现在我们可以实现prepareForSegue:sender:方法来连接属性:

@implementation AppVIEwController- (voID)prepareForSegue:(UIStoryboardSegue *)segue sender:(ID)sender {    if ([segue.IDentifIEr isEqualToString:@"MapEmbedding"]) {        [self prepareForMapEmbeddingSegue:segue sender:sender];    }}- (voID)prepareForMapEmbeddingSegue:(UIStoryboardSegue *)segue sender:(ID)sender {    self.mapVIEwController = segue.destinationVIEwController;    self.mapVIEwController.delegate = self;    // We can do any additional setup on mapVIEwController here,// like set its initial vIEwport.}

注意,AppVIEwController还必须实现mapvIEwController:dIDSelectMarker:,而MapVIEwController需要实现setMarkers:和zoomToMarker:.

总结

以上是内存溢出为你收集整理的ios – 与容器视图通信的最佳实践是什么?全部内容,希望文章能够帮你解决ios – 与容器视图通信的最佳实践是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1098498.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存