如何快速获取指向视图控制器的全局指针

Posted

技术标签:

【中文标题】如何快速获取指向视图控制器的全局指针【英文标题】:How to get global pointer to view controller in swift 【发布时间】:2014-07-13 15:25:19 【问题描述】:

我正在使用 swift 构建一个应用程序。在我的应用程序中,我需要展示一个 UIPopoverPresentationController,并且我还需要通过我的普通视图控制器中的其他方法从该弹出框访问内容控制器。

为此,我通常会在目标 C 中创建一个指向我的视图控制器的全局指针,这将允许我从任何方法访问它。

这就是我在 Swift 中的做法:

class Categories: UITableViewController, UIPopoverPresentationControllerDelegate 

let storyBoard = UIStoryboard(name: "Main", bundle:nil)
var newCategory = self.storyBoard.instantiateViewControllerWithIdentifier("NewCategory") as NewCategory

//rest of my code

当我这样做时,Xcode 给了我错误:

Categories.type does not have a member named 'storyBoard'

谁能告诉我我做错了什么以及我需要如何修改我的代码来创建一个指向我的视图控制器的合法全局指针?任何帮助将不胜感激!

【问题讨论】:

首先:“as NewCategory”看起来不对,因为应该有变量的类型。例如:“var newCategory: NSData = NSData() as NSData”。并检查您对大小写的敏感性(如故事板和故事板) 【参考方案1】:

您应该为此使用@lazy 属性。下面是普通收据:

class MyClass 
    let compileTimeProperty = "compileTimePropert"

    @lazy var runTimeProperty:String = 
        return self.compileTimeProperty
    ()

下面是你的代码应该如何调整:

class Categories: UITableViewController, UIPopoverPresentationControllerDelegate 

    let storyBoard = UIStoryboard(name: "Main", bundle:nil)

    @lazy var newCategory: NewCategory = 
        return self.storyBoard.instantiateViewControllerWithIdentifier("NewCategory") as NewCategory
    ()

    //rest of your code

【讨论】:

【参考方案2】:

您将 var 声明放在任何代码之外(即在 Categories 类的顶层,而不是在任何函数内)。您不能在 func 之外的变量声明的默认值中引用 self,除非您还将该变量声明为 @lazy

一般来说:

class MyClass 
    let howdy = "howdy"
    var hello = self.howdy // illegal

    func f() 
        var hello = self.howdy // legal
    

【讨论】:

【参考方案3】:

您的代码仅给出storyBoardnewCategory 的默认值,但Swift 不保证默认属性值将以任何特定顺序初始化。因此,在默认值中引用另一个属性是非法的。将用于设置这些值的代码移动到 init 中,它应该可以正常工作:

class Categories: UITableViewController, UIPopoverPresentationControllerDelegate 

let storyBoard: UIStoryboard
var newCategory: NewCategory

init 
    storyBoard = UIStoryboard(name: "Main", bundle:nil)
    newCategory = self.storyBoard.instantiateViewControllerWithIdentifier("NewCategory") as NewCategory


//rest of code

为了明确术语:像这样在类的***声明变量不会使它们成为“全局变量”,它会产生类的属性。 (全局变量在任何类/结构/函数的范围之外声明。)此外,属性的规则与其他变量不同,因为在声明它们时不需要赋值(如果你这样做,它就是仅被视为默认值)——真正的要求是您必须提供默认值,或者在初始化程序中分配一个值。

但对于这种特殊情况,Keenle 的@lazy 解决方案是更合适的选择。

【讨论】:

好的,但是如果我将var newCategory = self.storyBoard.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController 放入初始化中,我将不再创建全局变量,而这正是我所需要的。你知道我怎样才能让它成为一个全局变量吗? Xcode sais 类型注释在 Pattern 中丢失,我需要添加什么? 哦,对不起,我马虎了。当然,属性声明需要类型注释。

以上是关于如何快速获取指向视图控制器的全局指针的主要内容,如果未能解决你的问题,请参考以下文章

获取堆栈上控制器的指针

应用程序关闭后如何快速保存全局变量?

如何从位于故事板上的视图控制器获取子视图

如何以编程方式快速使用情节提要 ID 获取当前视图控制器(当前正在呈现)?

qt如何获取主窗口的指针

自定义视图切换效果