我创建了一个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)
}
}
答案 0 :(得分:3)
此视图控制器是从另一个视图控制器调用还是从另一个视图控制器调用?在这种情况下,您应该在source的prepareForSegue方法中设置delegate属性,或者调用此当前视图控制器的任何机制。另外,为什么协议继承“类”?这是另一个协议的名称吗?
无论如何,你的委托是零,因为它从未被设置,似乎你应该从调用有问题的视图控制器的对象设置它。另请注意,您的代理人很弱,因此除非另一个对象有强烈的引用,否则您的代表在分配后将很快为零。
答案 1 :(得分:1)
我认为你试图通过设置它来访问委托,它指向一个尚未创建的对象。现在委托的值为nil,代码变为nil。(某些属性)这意味着更少它打印出异常。在设置委托后尝试使用“if let”,这是更好的编码实践。