【问题标题】:unexpectedly found nil while unwrapping an Optional value (swift)在展开可选值时意外发现 nil (swift)
【发布时间】:2015-10-06 05:17:33
【问题描述】:

我在尝试更改属于 Page 类(UIViewController 的子类)的标签文本时出现标题错误

@IBAction func StartButton(sender: AnyObject) {

    for quote in quoteList {

        var newPage = Page()
        //error is on the next line:
        newPage.Label.text = quote

        pageArray!.append(newPage)
    }

}

}

这是 Page 类:

class Page : UIViewController{

var index: Int = 0

var parent: PageArray?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

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

@IBOutlet weak var Label: UILabel!


@IBAction func previousButton(sender: AnyObject) {
}


@IBAction func gotoListButton(sender: AnyObject) {
}


@IBAction func nextButton(sender: AnyObject) {
}

}

对于快速编程和一般的 iO,我是新手;如果已经问过类似的问题,我深表歉意。我首先搜索,但没有找到适合我的解决方案。 我怀疑问题出在 newPage 的初始化上,并尝试了几种不同的方法,但我似乎无法做到正确。 我的问题是我到底做错了什么,我该如何解决?

编辑:让它像这样工作(工作是指不崩溃和什么都不做):

    @IBAction func StartButton(sender: AnyObject) {

    var pageArray: PageArray = PageArray()

    for quote in quoteList {

        var newPage = Page(nibName: "Page", bundle: nil)


        if newPage.Label != nil {
        newPage.Label.text = quote
        }

        pageArray.append(newPage)

    }

}

现在看来可以肯定 newPage.Label 为 nil。

【问题讨论】:

  • 我也有同样的问题。我尝试从@IBOutlet 中删除弱,但这无济于事。但是,所有非 IBOutlet 变量(例如索引、父级等)都是可访问的。它与这些对象如何从情节提要/XIB 文件中实例化(或不实例化)有关。还在挖。

标签: ios xcode swift


【解决方案1】:

好吧,pageArray 可能是 nil,而 ! 你假装它不是。

实例化 pageArray 应该可以解决您的问题。

您可以查看第一个答案here以快速了解更多关于问号和感叹号的信息

编辑

您的问题也可能来自您的控制器初始化,您可能想尝试一下:

let mystoryboard:UIStoryboard = UIStoryboard(name: "storyboardName", bundle: nil)
var newPage:Page = mystoryboard.instantiateViewControllerWithIdentifier("idYouAssigned") as! Page

【讨论】:

  • 这可能是个问题,但不是唯一的问题。在此之前我收到错误:newPage.Label.text = quote
  • @Xebeq 你有链接到 PageView 的 xib 文件吗?如果是这样,我相信它没有加载,Label 始终为零。您可能想使用NSBundle.mainBundle().loadNibNamed。如果你能确认你有一个 xib 文件,我会详细说明我的答案
  • 刚刚意识到,它是一个viewcontroller。初始化应该使用 nib 名称。我已经编辑了我的答案。
  • 我以前试过。出于某种原因,在我这样做之后,它认为 newPage 和 pageArray 都是字符串(??)。删除接下来的两行并再次编写它们可以解决此问题,但我仍然在同一个地方收到原始错误。
  • 另外,我的项目中唯一的 .xib 文件是 LaunchScreen.xib,我不相信它链接到 PageView。
【解决方案2】:

我知道你的问题。从 Nib 加载 ViewController 时。实际上,在加载 ViewController 之前需要延迟时间。

下面的这段代码可以帮助你的 ViewController 立即加载。

@IBAction func StartButton(sender: AnyObject) {

var pageArray: PageArray = PageArray()

for quote in quoteList {

    var newPage = Page(nibName: "Page", bundle: nil)

    let _ = newPage.view // A trick. It's help your view load immediate

    // Your Page has been loaded.
    newPage.Label.text = quote

    pageArray.append(newPage)

}

【讨论】:

  • 这给我带来了另一个错误:2015-07-17 15:18:24.363 Quotes[3277:855732] *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“可能不在捆绑中加载NIB:'NSBundle /user/Library/Developer/CoreSimulator/Devices/319D819D-C653-4AAF-ADDB-0514A8F055AE/data/Containers/Bundle/Application/042EE69B-E6D2-4CEF-A2D3-B1C438533DD1/ Quotes.app> (loaded)' with name 'Page'' *** First throw call stack:
  • 你尝试重命名这样的东西吗? stackoverflow.com/questions/12722461/…
  • 好吧,没关系。这和 Justa 的建议相结合似乎已经解决了这个问题。现在没有错误,没有什么是零。谢谢! (是时候解决新的令人兴奋的问题了)
猜你喜欢
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多