Swift代表和可选

时间:2015-03-05 22:54:28

标签: ios uitableview swift uiviewcontroller delegates

我正在使用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)
}

2 个答案:

答案 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,以帮助阻止保留周期。