ios - 为什么 app delegate 应该为其他 viewController 中使用的属性创建实例?

标签 ios swift objectinstantiation

我正在学习 Big Nerd Ranch 的 iOS 编程书中的 UITableView 教程。在本教程中,我们将一个新属性分配给 UIViewController,如下所示:

class ItemsViewController: UITableViewController {

    var itemStore: ItemStore!  

}

但是,在应用程序的 AppDelegate 中,我们在 AppDelegate 中实例化了这个 itemStore 属性,如下所示:

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.


        let itemStore = ItemStore()


        let itemsController = window?.rootViewController as! ItemsViewController

        itemsController.itemStore = itemStore

        return true
    }

    func applicationWillResignActive(_ application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }

    func applicationWillTerminate(_ application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }


}

我的问题是,为什么 app delegate 应该为其他 viewController 中使用的属性创建实例?这个属性不应该在实际使用它的 viewController 中实例化,或者通过这种方式实例化,itemStore 对象在应用程序运行期间保持事件状态?

最佳答案

这样做是为了使 ItemsViewController 更具可重用性。 ItemsViewController 不需要知道 ItemStore 对象的详细信息,包括要实例化哪个 ItemStore 子类。它只需要知道该对象所依附的接口(interface)。通过在外部设置 ItemStoreItemsViewController 可以轻松地与 ItemStore 的其他子类一起使用,而无需更改。

这在 iOS 编程:The Big Nerd Ranch Guide,第 6 版一书的第 10 章授予 Controller 对商店的访问权限部分中进行了介绍。

关于ios - 为什么 app delegate 应该为其他 viewController 中使用的属性创建实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49592262/

相关文章:

ios - 目标 View Controller 何时在 segue 期间初始化?

ios - 使用 Audiokit Sampler 实现泛音系列(谐波系列)

ios - tabBar 减小嵌套 ViewController 中 View 的大小

c# - 对象文字实例化比设置属性快吗?

ios - Dropbox 同步 API 访问 token

ios - 此版本的 OSX 无法执行必要的 dSYM 转换

iOS 7.1 : Border around search bar

ios - 尝试通过工具栏关闭 UIPickerView 导致意外行为

c++ - 单行类声明和实例化

php - 永久设置私有(private)类变量 PHP