Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 来自导航控制器的PresentViewController错误_Ios_Swift - Fatal编程技术网

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不要谈论那个<代码>自我。故事板是可选的。哦,明白了。我只是知道。谢谢你让我知道@博伊德坎。但是,错误是添加
任何对象是的,我知道,我不是说不是:)看看评论。