gpt4 book ai didi

ios - 什么时候可以通过将代码放在 AppDelegate 中来减少代码重复?

转载 作者:搜寻专家 更新时间:2023-10-30 20:24:04 26 4
gpt4 key购买 nike

我有一个非常小的 Xcode 项目,有几个 View Controller 。我发现自己在其中复制了以下方法:

- (void)postTip:(NSString *)message {
[self postInfoAlertWithTitle:@"Tip" andMessage:message andAction:@"Got it!"];
}

- (void)postInfoAlertWithTitle:(NSString *)title andMessage:(NSString *)message andAction:(NSString *)action {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:action style:UIAlertActionStyleDefault handler:nil]];
[self presentViewController:alert animated:YES completion:nil];
}

当然,这让我开始思考如何删除(或至少减少)重复代码。

显而易见的答案是将所需的行为放在父类中,然后让我的 View Controller 继承自该类。但是,有些 View Controller 是 UICollectionViewController 类型,有些是 UITableViewController 类型,如果我让它们继承自假设的 MyViewController is-a,我不知道如何分别保留它们的集合和表风格UIViewController.

所以我做了一些研究并查看了协议(protocol)。最初,这似乎很合适,只是您不能为协议(protocol)中声明的方法提供默认实现,这基本上是我想要的。

最后,在犹豫和 self 厌恶的情况下,我考虑将行为放在我的 AppDelegate 类中,并附加一个参数以方便显示警报:

- (void)postTip:(NSString *)message toController:(UIViewController *)controller;
- (void)postInfoAlertWithTitle:(NSString *)title andMessage:(NSString *)message andAction:(NSString *)action toController:(UIViewController *)controller;

给定 View Controller 中的调用如下所示:

[self.appDelegate postTip:@"Git gud!" toController:self];

等等!我想要的行为,我想要它的地方,以及我必须做的所有事情都可以获得 AppDelegate 的实例!但是……这对我来说不太合适。好像……很臭。此外,仍然存在一些重复,即声明和初始化私有(private) appDelegate 属性,我已经注意这样做而不是在我需要的任何地方调用 (AppDelegate *)[[UIApplication sharedApplication] delegate] 以便:

  • 我可以指定“弱”并避免可能的保留周期
  • 我只接受一个指向 AppDelegate 的指针(为过早优化欢呼 >.<)

将 AppDelegate 用作应用程序范围内的行为(例如实用程序方法)的存储库是否被认为是可以接受的,如果是这样,我是否对实现 re: 使用属性产生了不必要的偏执? (如果没有,我有什么选择?)

最佳答案

通过创建 .h 和 .m 文件明确使用类别

UIViewController+InfoAlert.h

@interface UIViewController (InfoAlert)

- (void)postInfoAlertWithTitle:(NSString *)title andMessage:(NSString *)message andAction:(NSString *)action;

@end

UIViewController+InfoAlert.m

#import "UIViewController+InfoAlert.h"

@implementation UIViewController (InfoAlert)

- (void)postInfoAlertWithTitle:(NSString *)title andMessage:(NSString *)message andAction:(NSString *)action {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:action style:UIAlertActionStyleDefault handler:nil]];
[self presentViewController:alert animated:YES completion:nil];
}

@end

然后只需在您要使用新的 postInfoAlertWithTitle 方法的地方导入您的 UIViewController+InfoAlert.h

关于ios - 什么时候可以通过将代码放在 AppDelegate 中来减少代码重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43765518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com