ios - Swift 委托(delegate)和可选

标签 ios uitableview swift uiviewcontroller delegates

我正在使用 swift 开发我的第一个 iOS 应用程序。我正在尝试将 a 值从一个 viewController 加载到另一个 viewController 中。我正在使用一个协议(protocol),但我无法让它正确执行。我已经在堆栈溢出和其他地方进行了搜索,但未能找到适合我情况的答案。

这是我试图从中提取值(value)的 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.
    }
}

这里是我尝试将值(和 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)设为可选 (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

现在,我知道我将 delegate 声明为 nil,但这是我对正在发生的事情的理解的限制。我需要在此函数中的后续 VC 中添加值:

func didFinishAddingHelper(controller: AddHelperViewController) {
    self.effectiveCombat = Int(controller.helperBonus)
    controller.navigationController?.popViewControllerAnimated(true)
}

最佳答案

发生崩溃是因为 AddHelperViewControllerdelegate 属性为 nil。这是因为您没有设置它。

无论您在何处创建 AddHelperViewController,都请在下一行设置其委托(delegate):

let addHelperVC = AddHelperViewController()
addHelperVC.delegate = self

然后当您调用 delegate 属性时,它会指向创建它的 View Controller 。

如果您的 AddHelperViewController 是使用 Storyboard创建的,请在 prepareForSegue(_:sender:) 中设置 delegate显示新 Controller :

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let vc = segue.destinationViewController as? AddHelperViewController {
        // If we got here, vc is an AddHelperViewController 
        vc.delegate = self
    }
}

关于ios - Swift 委托(delegate)和可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28889416/

相关文章:

iphone - 如何以编程方式取消 segue 并保持在同一 View 中

ios - 呈现 UIImagePickerController 后应用程序崩溃

ios - 工具栏和 TableView 让我头疼

ios - 嵌套表格和 Collection View 的 self 调整单元格

ios - 如何在集合类型约束中制作泛型?

ios - RestKit:映射 JSON 字符串数组

ios - 平移手势干扰滚动

ios - Swift 中的 TableView

Swift - 如何在同一函数中为两个不同的 SKNodes 非同时(以线性模式)运行 2 个 Action

swift - 合并/追加 [AnyHashable : Any]() on Swift 3