gpt4 book ai didi

ios - Swift 委托(delegate)和可选

转载 作者:行者123 更新时间:2023-11-28 07:09:45 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com