将委托从 ViewController 分离到自己的类

Posted

技术标签:

【中文标题】将委托从 ViewController 分离到自己的类【英文标题】:Separating delegates from ViewController to own classes 【发布时间】:2013-09-04 15:07:31 【问题描述】:

我是 ios 开发的新手,我有点困惑我应该如何分离我的代码以避免巨大的 ViewController.m 文件。目前我的主视图控制器有很多委托:

@interface ViewController : UIViewController <MKMapViewDelegate, HttpClientDelegate, CLLocationManagerDelegate, NSFetchedResultsControllerDelegate>

我想减少 viewController 代码,我想我应该创建单独的类来处理委托任务。问题是,如果我为 CLLocationManager 创建单例类并让它实现委托方法,那么我如何与视图控制器通信?

假设我的 CLLocationManager 收到位置更新,我如何告诉 viewController 对 UI 进行更改?我应该使用 NSNotificationCenter 发布通知,然后将观察者添加到视图控制器吗?还是让 viewController 像现在一样实现所有委托方法的最佳方式是什么?

【问题讨论】:

我相信你的想法是错误的。你的视图控制器可能太复杂了,因为你有太多的视图逻辑。将特定视图的逻辑提取到新的 UIView 类中。你正在实现的唯一一个不属于 ViewController 的委托是 HttpClientDelegate @bengoesboom 我不同意。 iOS 世界中的“MVC”或 Massive View Controller 是一个大问题。分离出各种与委托相关的代码是一件好事。对于 OP,您可以使用自己的自定义委托协议,或阻止回调,或通知将消息发送回视图控制器。 总有分类... 【参考方案1】:

将部分功能移入您的数据模型。

鉴于您提供的信息有限,很难说您应该如何管理它,但人们不得不怀疑单个视图控制器是否真的应该管理地图视图跟踪位置管理 HTTP 连接管理核心数据获取。为什么不将其中的一部分移到您的模型中,这样会更容易划分为模块?

假设我的 CLLocationManager 收到位置更新,怎么办 我告诉 viewController 对 UI 进行更改?我应该使用 NSNotificationCenter 发布通知,然后将观察者添加到 视图控制器?

通知将是一个很好的解决方案——它为管理位置的程序部分(同样,这可能属于模型)提供了一种方式来传达更改,而无需了解任何关于关心位置变化的程序。它还允许一对多通信——如果您有另一个同样关心位置的视图控制器,它可以观察到相同的通知。

或者是让 viewController 像现在一样实现所有委托方法的最好方法?

我尝试考虑适当地划分职责,而不是限制代码的大小。如果你有一个类只完成一项工作但需要大量代码来完成它,那很好。如果你有一个类来管理许多不相关的事情,那就不太好了。问题是很多工作似乎都落入了视图控制器的传统“管理一屏内容”的角色。尝试将管理数据表示的任务(这是视图控制器的正当工作)与管理数据本身(这是模型的工作)分开。

【讨论】:

【参考方案2】:

实现一个负责委托方法的类:

@interface DelegateManager : NSObject <MKMapViewDelegate, HttpClientDelegate, CLLocationManagerDelegate, NSFetchedResultsControllerDelegate>
-(id)initWithViewController:(ViewController*)vc;
@property (weak) ViewController *delegate;
@end

在您的视图控制器中:

@interface ViewController : UIViewController
-(void)doSomething;
@end

在您的 ViewController 中,使用 self 作为参数创建 DelegateManager 的实例。将所有代表的目标设置为您的 DelegateManager。在您的 DelegateManager 的委托方法中,调用 [self.delegate doSomething]; 与您的 ViewController 进行通信。

【讨论】:

以上是关于将委托从 ViewController 分离到自己的类的主要内容,如果未能解决你的问题,请参考以下文章

实现从 viewController 到 DataManager 类的委托

委托/协议不起作用:将数组从 TableViewController 传递给父 ViewController

如何使用委托Objective c从UITableViewCell.xib创建到ViewController的segue?

从委托的源 ViewController 调用异步闭包

尝试从 UIView 的按钮转移到另一个 ViewController 时,委托不起作用

iOS:通过委托方法从推送的 ViewController 返回?