将数据从表传递到第一个View控制器 - 错误:在展开Optional值时意外发现nil

时间:2016-04-11 21:31:07

标签: ios swift uitableview

当我尝试将选定的表行传递回我的第一个视图控制器时,它会给出一个错误,即选项为零。

但是,我可以打印我想传递的变量的值。

视图控制器按此顺序排列。

  1. 向库存添加新“项目”
  2. 选择新VC以选择“类别”,然后选择另一个VC以选择子类别。
  3. 从那些你可以转到另一个VC来创建类别和子类别。
  4. 项目来源@ https://github.com/GadgetAddict/InventoryApp

    override func tableView(tableView: UITableView,  didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let dict = items[indexPath.row]
    
        let selectedSub = dict["subname"] as! String
    
        let newCat = Category(catName: passedCategory, subcatName: selectedSub)
        print(newCat.catName)
        print(newCat.subcatName)
    
        delegate.setCats(newCat)
    
        self.navigationController?.popToRootViewControllerAnimated(true)
    
    }
    

2 个答案:

答案 0 :(得分:1)

我在Github上查看了你的代码并意识到在显示DestinationViewController之前你没有设置委托。因此,我相信如果您在该行delegate.setCat("something")上设置断点,您会看到您的委托的值已设置为nil

有两种解决方法。首先是继续使用委托模式,你的代码看起来应该是这样的;在呈现DestinationViewController之前,delegate值不是nil

let subCatVC = self.storyboard?.instantiateViewControllerWithIdentifier("yourSubCatStoryboardIdentifier") as! SubcategoryVC
subcatvc.delegate = self

接下来我要说的可能不完全是核心,我只是假设iOS的底层架构是有效的。

在多个屏幕上传递委托方法很棘手。例如,您的应用转到NewItemVC - > CategoryVC - > SubCategoryVC,所以你在NewItemVC初始化的delegate,当你到达SubCategoryVC时可能是nil,因为当你在NewItemVC设置它或者它被重置时,它的内存还没有被分配你达到CategoryVC。

所以我建议使用NSNotificationCenter将数据从DestionationVC传递回NewItemVC。代码应该看起来像这样:

NewItemVC.swift

override func viewDidLoad(){
 super.viewDidLoad()
 let notifCenter = NSNotificationCenter.defaultCenter()
 notifCenter.addObserver(self, selector: #selector(NewItemVC.setCat), name: "setCategoryNotification", object: nil)
}

func setCat(notification:NSNotification){

    let userInfo:Dictionary<String,String!> = notification.userInfo as Dictionary<String,String!>
    //your selected category can be extracted here
    let selectedCategory = userInfo["selectedCategory"]
}

SubCategoryVC.swift

override func tableView(tableView: UITableView,  didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let dict = items[indexPath.row]

    let selectedSub = dict["subname"] as! String

    let newCat = Category(catName: passedCategory, subcatName: selectedSub)
    print(newCat.catName)
    print(newCat.subcatName)

    let notifCenter = NSNotificationCenter.defaultCenter()
     notifCenter.postNotificationName("setCategoryNotification",
                            object:nil,
                            userInfo:["selectedCategory":selectedSub])

    self.navigationController?.popToRootViewControllerAnimated(true)

}

答案 1 :(得分:0)

从您发布的代码中,您获得此类错误的唯一可能方法是在此处进行显式转换:

let selectedSub = dict["subname"] as! String

但是你应该调试一下,看看哪条线路确切崩溃,因为它也可能在你的其他控制器中。