如何从Objective-C中的视图控制器访问主窗口?

时间:2011-11-16 03:28:12

标签: iphone objective-c

我创建了一个名为HomeViewController的自定义视图控制器,它继承自UIViewController。在主应用程序委托中,我通过在函数[window addSubview:homeViewController.view]内调用applicationDidFinishLaunching来显示它。是的,一切正常。

现在我在HomeViewController xib文件中添加一个按钮。当我点击它时,我希望window删除当前视图并添加另一个navigationController。我在HomeViewController.m中创建了一个函数并链接到按钮,但我不知道如何从那里访问属性windowwindow是主应用委托中的局部变量,按钮单击处理程序位于HomeViewController内。我正在考虑做与上面类似的事情,即将navigationController.view添加为window的子视图。

抱歉!我对这个iphone应用程序开发很新。我并没有真正了解应用程序流程应该如何。也许我的项目结构出了问题?

3 个答案:

答案 0 :(得分:13)

您可以使用以下线

访问应用中任何位置的主窗口
[[[UIApplication sharedApplication] windows] objectAtIndex:0]

答案 1 :(得分:5)

[(AppDelegate *)[[UIApplication sharedApplication] delegate] window]可能会帮助您访问代理人的window属性。

AppDelegate是您的委托类名称。

答案 2 :(得分:0)

您可以为UIViewController添加扩展名。在斯威夫特:

extension UIViewController {

    var window : UIWindow {
        return UIApplication.shared.windows.first!
    }

}

现在您可以从任何视图控制器中访问它。例如:

override func viewDidLoad() {
    super.viewDidLoad()

    self.window.tintColor = .orange
}

表面上你应该有一个窗口,所以你应该能够安全地强制打开窗口,但是,如果你正在做与窗口层次结构不同的事情,你可以选择它:

extension UIViewController {

    var window : UIWindow? {
        return UIApplication.shared.windows.first
    }

}

使用选项实施:

override func viewDidLoad() {
    super.viewDidLoad()

    if let window = self.window {
        window.tintColor = .orange
    }
}