当我尝试将选定的表行传递回我的第一个视图控制器时,它会给出一个错误,即选项为零。
但是,我可以打印我想传递的变量的值。
视图控制器按此顺序排列。
项目来源@ 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)
}
答案 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
但是你应该调试一下,看看哪条线路确切崩溃,因为它也可能在你的其他控制器中。