正确使用UIViewController中的present

时间:2019-02-04 13:14:01

标签: swift uiviewcontroller closures

我遇到这样的问题:我无法使用“自我”在我的班级中展示动态UIViewController。它告诉我“类型'(LoginScreenVC)->()->(LoginScreenVC)'的值没有成员'view'”。

使用闭包(例如TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] ,但是由于要切换到的UIViewController是动态的,因此我无法将其强制转换为特定的UIViewController。

还有其他显示ViewController的方法吗?

这是我的代码:

SWIFT 4.2 / XCode 10.1

if let loginScreen = UIStoryBoard ...

1 个答案:

答案 0 :(得分:2)

您在说:

let handlerBlock: (String) -> Void = { redirect in
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let loginScreen = storyboard.instantiateViewController(withIdentifier: redirect)
    self.present(loginScreen, animated: true, completion: nil)
}

问题是您在没有self的情况下使用术语self。 (好吧,有一个self,但这不是您想的。)present是一个UIViewController实例方法,因此self必须是一个UIViewController实例;在这种情况下,不是。

我可以想出六种方法来表达您想要表达的东西,但是最简单的方法可能是将其重写为:

func handlerBlock(_ redirect:String) -> Void {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let loginScreen = storyboard.instantiateViewController(withIdentifier: redirect)
    self.present(loginScreen, animated: true, completion: nil)
}

现在handlerBlock是一个 instance方法,而self是有意义的-它就是实例,这正是您想要的。其余代码保持不变,因为表达式handlerBlock中的裸名requestToken(success: handlerBlock)是一个函数名,就像以前一样。