我正在使用swift开发我的第一个iOS应用程序。我正在尝试将一个viewController中的a值加载到另一个viewController中。我正在使用协议,但我不能让它正确执行。我已经搜索了堆栈溢出和其他地方,但无法找到适合我的情况的答案。
这是VC我试图从中获取价值:
protocol AddHelperVCDelegate {
func didFinishAddingHelper(controller: AddHelperViewController)
}
class AddHelperViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate {
@IBOutlet weak var tableView: UITableView!
let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!
var fetchedResultsController:NSFetchedResultsController = NSFetchedResultsController()
var delegate:AddHelperVCDelegate! = nil
var helperBonus:NSNumber = 0
override func viewDidLoad() {
super.viewDidLoad()
fetchedResultsController = getFetchResultsController()
fetchedResultsController.delegate = self
fetchedResultsController.performFetch(nil)
// Do any additional setup after loading the view.
}
}
这是我试图将值(和视图)移回到正在进行的VC的地方。
// UITableViewDelegate
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
var indexPathForRow = tableView.indexPathForSelectedRow()
println("indexPath for selected row is: \(indexPathForRow)")
let thisUser = fetchedResultsController.objectAtIndexPath(indexPath) as UserModel
var cell:UserCell = tableView.dequeueReusableCellWithIdentifier("helperCell") as UserCell
helperBonus = thisUser.effectiveCombat
helperBonus = Int(helperBonus)
println("helperBonus is: \(helperBonus)")
delegate.didFinishAddingHelper(self)
}
如果我将委托作为可选(delegate?.didFinishAddingHelper(self)
),则没有任何反应。如果我不这样做,我会收到错误消息:
indexPath for selected row is: Optional(<NSIndexPath: 0xc000000000018016> {length = 2, path = 0 - 3})
helperBonus is: 0
fatal error: unexpectedly found nil while unwrapping an Optional value
现在,我知道我宣布代表为零,但这是我对正在发生的事情的理解的限制。我需要在此函数中添加进程VC中的值:
func didFinishAddingHelper(controller: AddHelperViewController) {
self.effectiveCombat = Int(controller.helperBonus)
controller.navigationController?.popViewControllerAnimated(true)
}
答案 0 :(得分:1)
崩溃正在发生,因为AddHelperViewController
的{{1}}属性为delegate
。这是因为你没有设置它。
无论您在何处创建nil
,请在下一行设置其委托:
AddHelperViewController
然后,当您调用let addHelperVC = AddHelperViewController()
addHelperVC.delegate = self
属性时,它将指向创建它的视图控制器。
如果您使用情节提要创建delegate
,请在即将显示新控制器的方法的AddHelperViewController
中设置delegate
:
prepareForSegue(_:sender:)
答案 1 :(得分:0)
var delegate:AddHelperVCDelegate! = nil
应该是
var delegate:AddHelperVCDelegate?
它失败了,因为你正在使用!
,这意味着你可以保证,虽然它在类init
期间无法初始化,但是当你想要它时它不会是零用它。
当Aaron Brager说你需要设置委托属性时,他绝对是正确的。
将委托声明为可选(带?
),只有当对象不为nil时才能调用它(否则忽略):
delegate?.didFinishAddingHelper(self)
另外,您还可以考虑制作delegate
属性weak
,以帮助阻止保留周期。