【问题标题】:Swift: Setting ViewController background color from AppDelegateSwift:从 AppDelegate 设置 ViewController 背景颜色
【发布时间】:2018-10-21 00:47:20
【问题描述】:

我想更改 ViewController 的背景颜色。在视图控制器中,我可以写self.view.backgroundColor = UIColor (red: 0, green: 0.0, blue: 0.5, alpha: 1.0)。 但是,我需要从 AppDelegate 更改它。根据this answer,在 AppDelegate 中访问 ViewController 的属性是这样的:

1) 设置全局变量:var myViewController: ViewController!

2)

var theViewController = ViewController()
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.myViewController = theViewController

这样

self.myViewController.view.backgroundColor = UIColor (red: 0, green: 1.0, blue: 0.5, alpha: 1.0)

应该改变背景颜色。然而,事实并非如此。 如何从 AppDelegate 更改 ViewController 的背景颜色?

【问题讨论】:

  • 您从未将视图控制器视图添加到视图控制器视图层次结构中。

标签: ios swift uiviewcontroller appdelegate uibackgroundcolor


【解决方案1】:

您正在使用var theViewController = ViewController() 创建视图控制器的新实例,并将新实例存储在您设置的全局变量中,但该实例从未在任何地方使用。

您想要的是应用程序使用的视图控制器实例。我不确定您的应用视图层次结构是如何设置的,但您可能希望为您的应用获取根视图控制器。

在 AppDelegate 类中你可以试试

theViewController = self.window?.rootViewController
theViewController.view.backgroundColor = UIColor (red: 0, green: 1.0, blue: 0.5, alpha: 1.0)

【讨论】:

  • 如果我尝试访问由public func foo(){...} 定义的视图控制器中的另一个函数并使用theViewController!.foo() 在AppDelegate 中调用它,我会收到错误“'UIViewController' 类型的值没有成员'富'”。我猜这是因为我定义的函数只是为这个特定的视图控制器定义的,而不是一般的 ViewController 成员函数。有没有办法使用这种方法调用函数?
  • 要调用特定于视图控制器类的函数 foo(),您需要强制转换视图控制器。将 ViewController 声明为它实际的类类型:theViewController: MyViewController?,然后为其分配一个强制类型转换:theViewController = self.window?.rootViewController as? MyViewController
【解决方案2】:

你可以试试,说如果你的根是一个navigationController

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

    // wait until vc is displayed

    DispatchQueue.main.asyncAfter(deadline: .now() + 4) {

        if let vv = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController {

            vv.viewControllers.last?.view.backgroundColor = UIColor.blue
        }
    }

    return true
}

【讨论】:

  • 这个答案比我的更彻底——尤其是考虑到导航控制器。如果您需要在应用程序的生命周期中的不同时间更改颜色,您仍然需要全局变量,以便以后更改它。 var theViewController = vv。另一种选择:而不是asyncAfter,您可以在应用程序委托上创建一个函数,在需要更改颜色时调用该函数。该函数检查theViewController 是否为零。如果为 nil,则通过调用 Sh_khan 代码中闭包内的代码来设置它。
  • @jimmyg 当然我提供 DispatchAfter 是为了说明目的,我认为不需要创建一个全局 vc 来在呈现时设置它并在我们想要更改颜色时检查它topVc ,如果 OP 有一个简单的结构,他可以很容易地通过代码获得它,确保根可能是 navigatio、tabBar 或 VC 处理它是 OP 的责任
猜你喜欢
  • 2015-07-20
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 2023-03-25
  • 1970-01-01
  • 2010-09-17
相关资源
最近更新 更多