致命错误:在过滤时展开可选值时意外发现 nil

Posted

技术标签:

【中文标题】致命错误:在过滤时展开可选值时意外发现 nil【英文标题】:fatal error: unexpectedly found nil while unwrapping an Optional value while filtering 【发布时间】:2014-11-14 05:02:25 【问题描述】:

我创建了一个TableViewController 来过滤来自CoreData 数据库的结果,当我尝试使用以下IBAction 实现过滤器时遇到此错误。我已经挖掘了代码检查拼写错误,但我没有发现任何错误。非常感谢任何帮助解决这个问题,因为我对编程很陌生:

fatal error: unexpectedly found nil while unwrapping an Optional value

@IBAction func saveButtonTapped(sender: UIBarButtonItem) 
    println("saveButtonTapped")
    delegate!.filterViewController(self,
        didSelectPredicate: selectedPredicate,
        sortDescriptor: selectedSortDescriptor)

    dismissViewControllerAnimated(true, completion:nil)

这是 TVC 类的代码:

import UIKit
import CoreData

protocol FilterViewControllerDelegate: class 
    func filterViewController(filter: RollerFilterViewController,
        didSelectPredicate predicate:NSPredicate?,
        sortDescriptor:NSSortDescriptor?)


class RollerFilterViewController: UITableViewController 

// outlet connected to cell on storyboard
    @IBOutlet weak var shoulderCell: UITableViewCell!
// Variables for filter
weak var delegate: FilterViewControllerDelegate?
var selectedSortDescriptor: NSSortDescriptor?
var selectedPredicate: NSPredicate?
var coreDataStack: CoreDataStack!

lazy var shoulderPredicate: NSPredicate = 
    var predicate = NSPredicate(format: "stretch.muscleGroup contains[cd] %@", "shoulder")
    return predicate!
    ()

// MARK - UITableViewDelegateMethods
override func tableView(tableView: UITableView,
    didSelectRowAtIndexPath indexPath: NSIndexPath) 

        let cell = tableView.cellForRowAtIndexPath(indexPath)!

        switch cell 
            // cases for muscle groups
        case shoulderPredicate:
            selectedPredicate = shoulderPredicate
        default:
            println("default case")
        
        if cell.accessoryType == .Checkmark 
            cell.accessoryType = .None
            println("removed checkmark")
         else 
            cell.accessoryType = .Checkmark
            println("set to checkmark")
        

// MARK - UIButton target action

@IBAction func saveButtonTapped(sender: UIBarButtonItem) 
    println("saveButtonTapped")
    delegate!.filterViewController(self,
        didSelectPredicate: selectedPredicate,
        sortDescriptor: selectedSortDescriptor)

    dismissViewControllerAnimated(true, completion:nil)


【问题讨论】:

你设置过代理吗? "unexpectedly found nil" 相信错误。有些东西是零。使用调试器找出什么。正如@rdelmar 建议的那样,很可能是delegate 【参考方案1】:

这个视图控制器是从另一个视图控制器调用还是从另一个视图控制器调用?在这种情况下,您应该在源的 prepareForSegue 方法中设置委托属性,或者在调用此当前视图控制器的任何机制中设置。另外,为什么协议要继承“类”?这是另一个协议的名称吗?

无论如何,您的委托是 nil,因为它从未被设置,而且您似乎应该从调用相关视图控制器的对象中设置它。另请注意,您的委托很弱,因此除非另一个对象对它有强引用,否则您的委托在分配后很快就会为零。

【讨论】:

谢谢。这是我第一个不是教程的“项目”。我从工作代码中建模了这个类,但我使用的例子是倒退的。我知道问题出在哪里。在花了一天的时间阅读文档后,我将重新开始上课并整合您的信息;)【参考方案2】:

我认为您正在尝试访问委托而不设置它,它指向一个尚未创建的对象。现在委托的值为 nil 并且代码变为 nil。(某些属性)这意味着更少它会打印该异常。在设置委托后尝试它并使用“if let”,这是更好的编码实践。

【讨论】:

谢谢!当我查看调试区域的输出时,我明白了你在说什么。你能再低调一点吗?我需要把什么放在哪里?它应该在 IBAction 内部还是引入 selectedSortDescriptor、selectedPredicate 变量的地方? 尝试将viewdidload中的代理设置为destinationcontroller.delegate = self; 好吧,看起来他的delegate 属性没有设置,而不是目标控制器的委托。在 viewDidLoad 中试试这个:delegate = FilterViewControllerDelegate()。或者您的委托符合该协议的任何类型。

以上是关于致命错误:在过滤时展开可选值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章

Swift 错误致命错误:在展开可选值时意外发现 nil

@IBInspectable 致命错误:在展开可选值时意外发现 nil

为啥我收到错误:致命错误:在展开可选值时意外发现 nil?

Swift:致命错误:在展开可选值时意外发现 nil

swift 2 致命错误:在展开可选值时意外发现 nil - 类别名称

崩溃:致命错误:在展开可选值时意外发现 nil