Ios 来自导航控制器的PresentViewController错误
我有一个Ios 来自导航控制器的PresentViewController错误,ios,swift,Ios,Swift,我有一个UINavigationController子类,如果用户未登录,我希望该子类重定向到登录页面。在viewdidload()中,我有: if(AppUser == nil){ var SignIn: AnyObject! = self.storyboard.instantiateViewController("SignInView") as! SignInViewController self.pushViewController(SignIn, animated: fa
UINavigationController
子类,如果用户未登录,我希望该子类重定向到登录页面。在viewdidload()
中,我有:
if(AppUser == nil){
var SignIn: AnyObject! = self.storyboard.instantiateViewController("SignInView") as! SignInViewController
self.pushViewController(SignIn, animated: false)
}
AppUser
链接到一个NSUserDefaults
对象SignenView控制器
是一个实际类,SignenView
是所需ViewController的情节提要ID。当我将所有这些代码放入viewDidLoad()
中时,第一行出现以下错误:
"Cannot invoke 'instantiateViewController' with argument of list type '(String)'"
第二行写着:
"Cannot invoke 'pushViewController' with an argument list of type '(Anyobject!, animated: Bool)'"
我做错了什么?它是否与从
UINavigationController
而不是从UIViewController
运行此操作有关?首先,确保self
指示您的UINavigationViewController
对于您的问题,我认为您需要更改这行代码:
var SignIn: AnyObject! = self.storyboard.instantiateViewController("SignInView") as! SignInViewController
为此:
if let signInViewController = self.storyboard.instantiateViewController("SignInView") as? SignInViewController {
// handle your sign-in view controller
}
我之所以更改此选项,是因为您指出
SignIn
是一个AnyObject代码>。当您处理Swift时,您必须非常清楚什么是?
和代码>平均值。顺便说一句,命名约定也很重要。您希望使用实例化eviewcontrollerwhiteIdentifier
而不是实例化eviewcontroller
比如说
if(AppUser == nil){
var signIn = self.storyboard?.instantiateViewControllerWithIdentifier("SignInView") as! SignInViewController
self.pushViewController(SignIn, animated: false)
}
您还应该删除AnyObject代码>从变量签名:任意对象代码>。此外,为了更好的编程实践,我还取消了signIn的资本化。这取决于你是否想这样做
这也是一个很好的做法,就像卢卡斯在回答中所做的那样,打开包装
if let signIn = self.storyboard?.instantiateViewControllerWithIdentifier("SignInView") as? SignInViewController{
self.pushViewController(SignIn, animated: false)
}
希望这对您有所帮助,如果您有任何问题,请告诉我:)分离点,但您不应该在viewdiload:
或viewwillbeen:
中推送视图控制器,因为这会扰乱您的视图层次结构。在演示其他内容之前,您需要确保正在进行的转换已完全完成。您不需要将AnyObject
标记为SignIn
只需执行var SignIn=self.storyboard!。实例化eviewController(“SignenView”)为!SignInViewController
以小写字母开头变量名也是一种很好的形式。大写通常是为类、结构和全局变量保留的。我没有分配您拥有的任何对象var sign:AnyObject代码>他可能必须使用self.storyboard?
或self.storyboard代码>不是真的,只要他能从实例化中很好地处理它。第二条错误消息表明类型根本不正确。这就是为什么我们不需要指定类型AnyObjects代码>不要谈论那个<代码>自我。故事板是可选的。哦,明白了。我只是知道。谢谢你让我知道@博伊德坎。但是,错误是添加任何对象代码>是的,我知道,我不是说不是:)看看评论。