在使用带有UIVewController的instantiateViewController时获取信号SIGABRT

时间:2016-11-30 20:31:39

标签: ios swift

我希望有人可以帮助我解决我遇到的这个问题。

我正在尝试将UIViewController的数组添加到UIPageViewController。但是,每当我尝试通过方法instantiateViewController访问视图控制器时,都会收到SIGABRT错误。

let vc: UIViewController = self.storyboard?.instantiateViewController(withIdentifier: views[index]) as! UIPageViewController

这是我的整个ViewController.swift文件,仅供参考。

import UIKit

class ViewController: UIViewController {

    var pageViewController: UIPageViewController!
    var views: [String] = ["view1","view2"]

    override func viewDidLoad() {
        super.viewDidLoad()

        self.pageViewController = self.storyboard?.instantiateViewController(withIdentifier: "pageViewController") as! UIPageViewController

        var arr: [UIViewController] = []

        for i in 0..<views.count{

            arr.append(assignView(index: i))

        }

        self.pageViewController.setViewControllers(arr, direction: .forward, animated: true, completion: nil )

        self.addChildViewController(self.pageViewController)
        self.view.addSubview(self.pageViewController.view)
        pageViewController.didMove(toParentViewController: self)

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func assignView (index: Int) -> UIViewController{

        let vc: UIViewController = self.storyboard?.instantiateViewController(withIdentifier: views[index]) as! UIPageViewController

        return vc

    }


}

有人可以告诉我为什么我的代码会给我这个错误吗?

非常感谢你!

3 个答案:

答案 0 :(得分:0)

从以下一行: self.storyboard?.instantiateViewController(withIdentifier:“pageViewController”)as! UIPageViewController

似乎故事板被视为可选。当你试图访问它时,故事板变量可能是nil.Ideally它不应该是nil而不应该是可选的。 如果有目的地完成了可选项,那么您可以在访问之前应用“if let”进行检查。

如果您需要进一步澄清,请与我们联系。

答案 1 :(得分:0)

SIGABRT是受控制的崩溃,应用程序主要是故意终止的。这主要是程序员的错误造成的。

寻找以下内容,因为有两种可能的原因导致崩溃。

  1. self.storyboard没有正确初始化,因为没有相应的故事板或错误引用。
  2. 查看控制器的标识符被错误引用。

答案 2 :(得分:0)

考虑以下示例

var mainView: UIStoryboard! mainView = UIStoryboard(name: "Main", bundle: nil) let samplecontroller : UIViewController = mainView.instantiateViewController(withIdentifier: "iPhone")

在上面的示例中,mainView是我的实例引用的StoryBoard,它是隐式展开的(这是为了指定这不能为零) samplecontroller是storyBoard中场景的实例。 “iPhone”是场景的StoryBoardID的名称。

如果我的故事板已正确设置并使用了ID和名称,则此片段将确保mainView永远不会为零。

在此之后,您仍然可以进行安全检查,如

if let test = mainView { //Do your stuff }

如果有帮助,请告诉我。