如何将依赖项注入 iOS 视图控制器?

2024-01-07

我的视图控制器需要向几个模型对象发送消息。如何获取视图控制器内这些模型对象的引用?

这些模型对象是“单例”(因为系统中一次只能有它们的一份副本),并且它们由多个视图控制器使用。所以我无法在每个视图控制器的 init 方法中实例化它们。

我无法使用构造函数注入,因为运行时选择用于创建视图控制器的 init 方法。

我不能使用“setter 注入”,因为(据我所知)我没有对新构造的视图控制器的引用和对“单例”模型对象的引用。

I don't want将模型对象转换为适当的单例,并从视图控制器调用它们的静态方法以检索单例实例,因为这是可测试性的问题。 (将模型对象作为 AppDelegate 的属性本质上与执行此操作相同。)

我正在使用 iOS 6 和 Storyboards。


我刚刚处理过同样的问题。由于我使用的是故事板,所以我不会实例化我的UIViewControllers,所以我不能使用“构造函数注入”。我必须使用 setter 注入来辞职。

我的应用程序根目录是UITabViewController。假设它有两个UINavigationControllers,第一个 aAControllerView和第二个BControllerView. In AppDelegate.applicationDidFinishLaunchingWithOptions您可以通过以下方式检索根控制器:

UITabBarController *tabBarController = (UITabBarController *) self.window.rootViewController;

然后你可以迭代控制器:

NSArray* viewControllers = [tabBarController viewControllers];
for (UIViewController *viewController in viewControllers) {
    UINavigationController *navigationController = (UINavigationController*) viewController;
    UIViewController *viewController = navigationController.topViewController;
    if ([viewController isKindOfClass: [AControllerView class]]) {
        AControllerView *a = (AControllerView*) viewController;
        // Inject your stuff
    }
    if ([viewController isKindOfClass: [BControllerView class]]) {
        BControllerView *b = (BControllerView*) viewController;
        // Inject your stuff
    }
}

希望能帮助到你。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将依赖项注入 iOS 视图控制器? 的相关文章

  • 剪裁为形状的 SwiftUI 图像在上下文菜单中具有透明填充

    在我的 SwiftUI 应用程序中 我的资产目录中有一张宽高比为 1 1 的图像 在我的代码中 我有一个Image使用不同的宽高比查看 将图像裁剪为新尺寸 Image My Image resizable aspectRatio conte
  • 如何执行 UIAlertAction 的处理程序?

    我正在尝试编写一个帮助程序类以允许我们的应用程序支持两者UIAlertAction and UIAlertView 然而 当写alertView clickedButtonAtIndex 方法为UIAlertViewDelegate 我遇到
  • 应用因广告标识符 (IDFA) 被拒绝

    我的申请因以下原因被拒绝 您和您的应用程序 以及与您有联系的任何第三方 签订广告服务合同 可以使用广告标识符 以及通过使用广告获得的任何信息 标识符 仅用于服务广告的目的 如果一个用户 重置广告标识符 则您同意不合并 直接或间接关联 链接或
  • 将 NSDate 转换为 SWIFT 中具有特定时区的字符串

    在我的核心数据库中 我有一个带有 NSDate 属性的 新闻 实体 我的应用程序遍布全球 新闻已发布2015 09 04 22 15 54 0000法国时间 GMT 2 为了保存日期 我将其转换为 UTC 格式 let mydateForm
  • iOS 应用内购买沙箱测试显示我的密码错误

    我在 itunesconnect 中创建了一个 Sandbox Tester 帐户 并通过我在网络上注册的电子邮件验证了电子邮件地址 验证后 我尝试使用沙盒帐户在我的应用程序中购买商品 并收到更改密码的提醒 所以我做了 然后我尝试使用新密码
  • 在flutter中跟踪背景位置时使用background_locator插件时出现问题

    我正在尝试使用 flutter 跟踪后台位置 为此我正在使用背景定位器 https pub dev packages background locator插入 它的实现方式是注册某些静态回调函数 我声明了一个 File 类型的类变量来在后台
  • iOS UITableViewCell需要按两次才能调用didSelectRowAtIndexPath

    我有一个 UITableView 有时需要您触摸它两次才能选择一个单元格 更多细节 仅当表格一直向上或一直向下滚动后才需要两次触摸 只需第二次触摸即可呼叫didSelectRowAtIndexPath 当表格以自然的 向上滚动位置 打开时
  • iOS7及以上版本中如何在接收器和扬声器之间切换音频输出?

    我有一个音频播放器 可以选择在接近传感器通知 1 时将音频输出从扬声器切换到接收器 耳机 无论是否连接耳机 以下是我执行此操作的代码 void switchAudioOutput NSString output AVAudioSession
  • 如何自定义 NSSlider

    我正在尝试在 Cocoa 中实现一个具有 5 个值的自定义滑块 查看我的演示项目 可以在此处下载 http s000 tinyupload com index php file id 07311576247413689572 http s0
  • 如何在 Monotouch 中对 UIImageView 进行运动模糊效果?

    在 MonoTouch 中进行实时运动模糊的方法是什么 当滚动惯性图片库时 我需要在 UIImageView 上应用运动模糊效果 以强度和方向作为参数 就像在 Photoshop 中一样 我在 CocoaTouch 或 CoreAnimat
  • 如何改进 iOS 中的 TWTweetComposeViewController 代码?

    我已经实现了以下代码来进行 Twitter 共享 在我的代码中 我尝试测试 iOS 5 如果这不起作用 我会回到使用 ShareKit 的 Twitter 代码进行共享的旧方式 我向同事展示了代码 他建议我的代码可能有缺陷 我需要做两件事
  • 如何使用 Unity 在 Android 设备上以各种宽高比显示游戏的相同部分?

    我从 Libgdx 引擎转向 Unity 是一名初级程序员 我尝试在 Unity 中为 Android 和 iOS 设备制作游戏 但在宽高比 分辨率缩放方面遇到问题 在 Libgdx 中 如果您开发了一些东西 您可以指定 默认 分辨率 并且
  • iPhone - 创建图像网格列表

    我正在开发一个应用程序 它从网站获取图像并使用网格视图向用户显示 例如Apple的照片应用程序 当您点击图像时 我会推送一个显示图像信息和其他内容的视图控制器 实现这个的更好方法是什么 我想到了自定义 UITableViewCell 我见过
  • CoreAnimation 性能分析 - CAReplicatorLayer 与 CAShapeLayer

    我正在制作一个依赖 CoreAnimation 的应用程序 它有一个 CAReplicatorLayer 和一个 CAShapeLayer 作为子层 当进行 12 次复制 然后对路径进行动画处理 在 touchMoved 上更改它 时 一旦
  • 移动 Safari 中的文件上传和 EXIF

    正如这些问题中所指出的 在某些情况下 iOS 上上传的照片的地理位置和其他 EXIF 元数据会被删除 在 safari 中 https apple stackexchange com questions 326789 gps exif fr
  • prepareForSegue 和代表

    我有一个有两个 segue 的应用程序 在其中一个 Segue 中 当前视图控制器成为委托 而另一个则不是 void prepareForSegue UIStoryboardSegue segue sender id sender if s
  • 如何更改 UISwitch 关闭状态的默认颜色?

    我想更改 UISwitch 中 onTintColor 的颜色以表示关闭状态 切换位于表格视图中 并且以编程方式进行切换 settingsSwitch setBackgroundColor UIColor whiteColor settin
  • 找不到导航对象。您的组件是否位于导航器屏幕内?

    在我下面的代码中 当我使用 useNavigation 时 它会给出像我的问题一样的错误 如何使用useNavigation 请任何人都可以解决此错误 错误 找不到导航对象 您的组件是否位于导航器屏幕内 我从这里跟踪了代码https rnf
  • cordova-plugin-whitelist 适用于 Android,但不适用于 iOS (Phonegap Build)

    我正在开发一个用 Cordova 封装并使用 Phonegap Build 构建的 JavaScript 应用程序 我们包括cordova plugin whitelist来自我们构建中的 npm 并添加了
  • 应用程序图标未刷新

    我更改了新版本应用程序中的图标图像 并且我在设备中安装了旧版本应用程序 然后我安装了新版本 它在 iOS 5 中运行良好 但在 iOS 6 中 图标没有刷新 它仍然显示旧版本图标 徽标 如果没有安装旧版本应用程序 该设备在 iOS 5 和

随机推荐

  • 如何检查 php://input 是否设置?

    我需要检查是否php input存在 设置 它可以与 PHP 一起使用吗isset https php net isset 正确的检查方法是什么 尝试用以下方法测试它file get contents http php net file g
  • 确定是否存在至少一行具有给定条件的行

    Employee 表有 ID 和 NAME 列 名称可以重复 我想查明是否至少有一行名称为 kaushik 所以查询应该返回 true false 或 1 0 是否可以使用单个查询找到它 如果我们尝试类似的事情 select count 1
  • 如何在 Tomcat 的 META-INF/context.xml 中指定路径

    我正在使用 Tomcat 7 希望在 war 文件本身中设置 war 文件的上下文根 并让 Tomcat 自动部署并选择此路径 我想我找到了通过将 context xml 放入包含的 war 的 META INF 目录中来做到这一点的方法
  • DataGrid DataGridTemplateColumn 组合框

    我的方法有问题ComboBoxes in a DataGrid 我用几张图来解释一下 这是起点 现在 如果我想添加新行 我单击最后一行并按 Enter 键 添加一个新行 并在此处选择类型表并为其命名为 MY TABLE 然后按 Enter
  • 这是互斥体的正确使用吗?

    我遇到的情况是 我可能同时运行一个程序的多个实例 并且重要的是 不要同时在多个实例中执行一个特定函数 这是使用互斥锁来防止这种情况发生的正确方法吗 lock this GetType log Info Doing Sync DoSync l
  • 带下划线的数据全文搜索

    我有一个索引表 其中索引列之一可以包含带下划线的数据 ID Name 1 01 A3L 2 02 A3L 3 03 A3L 4 05 A3L 5 some name 6 another name 7 a name 当我使用以下查询搜索该表时
  • ebXml OpenSource java实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在我们的项目中 我们正在寻找 OASIS ebXmlRegistry 3 0 规范的开源 java 实
  • 如何将所有新文件添加到 SVN

    我正在使用 ORM 它从 CLI 生成大量文件 有没有一种简单的方法来运行svn add目录中的所有文件显示为 当我跑步时svn status Edit这些文件存在于目录树中 因此添加 对于一个目录是行不通的 这将在指定的目录树下添加所有未
  • Node.js 的 Rails 控制台的等效项

    我正在尝试 Node js Express 框架 并寻找允许我通过控制台与模型交互的插件 类似于 Rails 控制台 NodeJS 世界里有这样的东西吗 如果没有 我如何与 Node js 模型和数据交互 例如手动添加 删除对象 测试数据方
  • JavaFX Alert 截断消息? [复制]

    这个问题在这里已经有答案了 我注意到如果我尝试展示Alert对于很长的消息 它往往会被截断 在单词边界处 Example import javafx application Application import javafx scene c
  • C 中 : 运算符的使用 [重复]

    这个问题在这里已经有答案了 可能的重复 结构体字段后面的 number 是什么意思 https stackoverflow com questions 3029442 what does number after a struct fiel
  • 使用条件更改 numpy 数组中的每个值

    我有一个从图像中获得的二维数组 现在它有 0 和 255 我想将所有 255 更改为 1 这对于for loop for i in range lenX for j in range lenY if img i j 255 img i j
  • 我可以在源perl程序中插入断点吗?

    我想要 perl 程序在某些条件满足时启动调试器 其他一些语言有库支持的 debug 语句 perl 中是否有类似的语句 如果我理解正确 您需要在代码中使用特定的调试器变量 DB single 在代码中将其设置为真值将导致调试器在该行停止
  • 使用 Powermock 模拟类的构造函数时出现 ExceptionInInitializerError。如何修复它?

    这是我的案例 我有一个 AbstractController 类 它有一个子类Controller 在 AbstractController 的方法之一中 实例化了一个新的 ApplicationLock 我想在为控制器编写 ut 时模拟
  • 将 CURLOPT_CAINFO 与更新的 CA 捆绑包一起使用会导致证书验证失败

    我使用 cURL 在 WordPress 插件中验证 PayPal 交易 最近 我开始收到有关用户因无法验证交易而无法完成购买流程的错误报告 我追踪到错误 SSL certificate problem verify that the CA
  • 从 TextView 到 EditText 的共享元素转换错误

    我正在尝试在TextView and a EditText but when showing the resulting Activity the text in theEditViewhave been shifted up See at
  • 我可以调用 jdbc 中的存储过程来使用 mysql 返回表吗?

    我是使用 jdbc 执行 mysql 存储过程的新手 我的问题是 是否可以调用返回 jdbc 中的表的存储过程 我搜索了很多 我知道我可以使用返回一定数量的参数registerOutParameter使用过程 但是包含几行的整个表怎么样 我
  • Facebook 应用程序如何向用户的所有好友发送消息?

    我们正在尝试构建一个应用程序 该应用程序可以根据登录用户的请求并在应用程序中进行适当的祝福 向任何或所有用户的 FB 好友发送一条消息 声明他们已收到一份礼物 我们已经能够以墙贴的形式向少数朋友发送此消息 通知和消息在 API 中不可用 然
  • 如何编写像 init.d 中使用的那样的 bash 脚本?

    我必须编写一个 bash 脚本来制作很多东西 我想像初始化脚本一样打印消息 例如 Doing A OK Doing B ERROR 你知道有什么方法可以做到这一点吗 提前致谢 在我所有的 Linux 机器上 执行此操作的代码位于文件中 et
  • 如何将依赖项注入 iOS 视图控制器?

    我的视图控制器需要向几个模型对象发送消息 如何获取视图控制器内这些模型对象的引用 这些模型对象是 单例 因为系统中一次只能有它们的一份副本 并且它们由多个视图控制器使用 所以我无法在每个视图控制器的 init 方法中实例化它们 我无法使用构