如何在 iOS 中精简视图控制器?

how to slim down view controllers in iOS?

你们是如何精简视图控制器的?有时您最终会在视图控制器中实现很多协议,因此控制器本身内部有很多代码。阅读有关如何在 iOS 中精简视图控制器的信息,我发现一种常见的方法是将 DataSources (http://www.objc.io/issue-1/lighter-view-controllers.html) 移动到其他 class,但是其他委托呢?或者如果您创建按代码查看?首先,我考虑将每个委托移动到一个 NSObject class,所以我尝试这样做:

self.locationManager.delegate = [[FRRYPetDescriptionViewControllerLocationDelegate alloc] init];

然后我在 IRC 上询问,有人建议类别,所以这就是我目前得到的:

// FRRYPetDescriptionViewController.h
@interface FRRYPetDescriptionViewController : UIViewController

@property (nonatomic) CLLocationManager *locationManager;

@property (nonatomic) TPKeyboardAvoidingScrollView *scrollView;
@property (nonatomic) UIView *contentView;

@end

// FRRYPetDescriptionViewController+Protocols.h
@interface FRRYPetDescriptionViewController (Protocols) <UITextViewDelegate, UIActionSheetDelegate, MFMailComposeViewControllerDelegate, UIGestureRecognizerDelegate, MKMapViewDelegate, UIViewControllerTransitioningDelegate, CLLocationManagerDelegate>

@end

// FRRYPetDescriptionViewController+UIAdditions.h
@interface FRRYPetDescriptionViewController (UIAdditions)

- (void)createScrollView;
- (void)createContentView;

@end

// FRRYPetDescriptionViewController+Callbacks.h
@interface FRRYPetDescriptionViewController (Callbacks)

@end

// FRRYPetDescriptionViewController+LocationAdditions.h
@interface FRRYPetDescriptionViewController (LocationAdditions)

@end

这让我想到,“私有”方法怎么样?我需要在视图控制器头文件中声明所有属性吗?。你们对这种方法有什么看法,或者有一些常见的模式可以遵循而不以胖控制器结束?

谢谢。

您提到的 link 对不太庞大的控制器编程有很好的解释。但是技术有点棘手,除非您是经验丰富的开发人员。您在问题中询问了多种技术。请在下面查看我对它们的看法:-

Delegates - 我个人更喜欢将委托代码保留在我的控制器本身中,以避免不必要的混淆,特别是当您在同一个控制器中处理多个场景时。
以编程方式创建视图 - 这是我们可以从 UIViewController 中削减大量代码的部分。除非是单个控件,例如单个标签或按钮,否则我们应该制作一个自定义 UIView class 并让它设置视图自定义的所有公共属性。控制器应仅使用必要的参数调用它。
头文件中的属性 - 不,数据封装的概念说我们应该只制作那些需要的变量public。休息应该转移到私有领域,这样我们的外部对象就不能干扰 class 对象的功能。因此,您应该在 class 扩展名(在 .m 文件内)中声明这些属性。此外,不需要将所有变量都作为属性,当它们是私有的时,您可以将它们声明为实例变量,因为 属性 声明只为该变量创建 getter/setter。
私有方法 - 方法也是如此。如果它不必暴露在其他物体上;它不应该在头文件中。将其作为私有方法保留在扩展中。