gpt4 book ai didi

Swift - 在协议(protocol)/委托(delegate)之间传递数据时出错(未找到)

转载 作者:搜寻专家 更新时间:2023-11-01 07:10:53 27 4
gpt4 key购买 nike

我正在使用 swift 3.0 开发应用程序。我想要做的是,从“MainMapVC”类开始,这是您拥有带有日期 slider 的 map 的 View (参见附图)。我想移动 slider 并将该 slider 位置(1,2 或 3)发送到 LeftSideViewController,它是根据所选日期更新内容的侧 View (图例)。

MainMapVC View :

enter image description here

带有图例的 MainMapVC View :

enter image description here

好吧,我已经到了必须在两个 View Controller 之间传递值的地步。但问题是我收到错误“ fatal error :在展开可选值时意外发现 nil”。基本上我有一个“无”委托(delegate)。

但是没有找到错误的地方,因为delegate的定义就像“var delegate: MainMapVCDelegate!”我在“MainMapVC”类中将其称为“delegate.moveSliderDates (datePos: Int (roundedValue))”。

有谁知道我在委托(delegate)的陈述中哪里失败了?谢谢 :)

我附上了这两个类的代码,以便您看到完整的代码。

类 MainMapVC(第一种方式):

import UIKit

protocol MainMapVCDelegate: class {

func moveSliderDates(datePos: Int)

}


class MainMapVC: UIViewController, UISearchBarDelegate, CLLocationManagerDelegate, GMSMapViewDelegate {

//MARK: VARIABLES
weak var delegate: MainMapVCDelegate? = nil


let step: Float = 1
@IBAction func moveSliderDates(_ sender: UISlider) {
let roundedValue = round(sender.value / step) * step
sender.value = roundedValue
delegate?.moveSliderDates(datePos: Int(roundedValue))

}

}

moveSliderDates 函数中的委托(delegate)值为“nil”:

delegate?.moveSliderDates(datePos: Int(roundedValue))

类 LeftSideViewController(第一种方式):

import UIKit

class LeftSideViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, customCellDelegate, MainMapVCDelegate {

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "MainMapVC" {
let secondViewController = segue.destination as! MainMapVC
secondViewController.delegate = self
}
}

func moveSliderDates(datePos: Int){
print(datePos)
print("/////////////")
tableSideLeft.reloadData()
}

因为“MainVC”的委托(delegate)是“nil”所以不能进入这个函数:

类 MainMapVC(第二种方式):

 let step: Float = 1
@IBAction func moveSliderDates(_ sender: UISlider) {
let roundedValue = round(sender.value / step) * step
sender.value = roundedValue

let data:[String: Int] = ["data": Int(roundedValue)]
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: data)

}

LeftSideViewController 类(第二种方式):

    func listnerFunction(_ notification: NSNotification) {
if let data = notification.userInfo?["data"] as? String {
print(data)
}



override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(listnerFunction(_:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil)
}

从不进入函数 listnerFunction

最佳答案

你收到错误是因为你通过这段代码将你的委托(delegate)定义为强制解包的 noy-nil 版本 var delegate: LeftSideDelegate!

相反,您需要像这样更改它。您不应为委托(delegate)创建强引用循环。

weak var delegate: LeftSideDelegate? = nil

然后对于所有委托(delegate)调用,执行包装版本的委托(delegate)调用

delegate?.changeZindexDelivery()

除此之外,将 protocol LeftSideDelegate { 行更改为 protocol LeftSideDelegate : class {

使用委托(delegate)在 View Controller 之间传递数据

首先,在要将数据传递给另一个 View Controller 的类中,以这种方式声明协议(protocol)

protocol SampleDelegate: class {
func delegateFunctionCall(data: String)
}

然后,创建可选的委托(delegate)变量,类型为弱变量。调用要传递数据或触发操作的委托(delegate)方法

class SecondViewController: UIViewController {

weak var delegate: SampleDelegate? = nil

@IBAction func sendTextBackButton(sender: AnyObject) {
delegate?.delegateFunctionCall(data: textField.text!)

}
}

最后,在您想要接收操作或数据的 View Controller 中,实现协议(protocol)。当您启动第二个 View Controller 时,将其委托(delegate)变量设置为当前 View Controller

class FirstViewController: UIViewController, SampleDelegate {

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showSecondViewController" {
let secondViewController = segue.destination as! SecondViewController
secondViewController.delegate = self
}
}

func delegateFunctionCall(data: String) {
label.text = data
}
}

使用通知在 View Controller 之间传递数据

在目标 View Controller 中,注册一个准备好被调用的处理函数。你可以在view did load中添加这个注册码

NotificationCenter.default.addObserver(self, selector: #selector(listnerFunction(_:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil)

func listnerFunction(_ notification: NSNotification) {
if let data = notification.userInfo?["data"] as? String {
// do something with your data
}
}

然后在另一个 View Controller 中,如果你想传递数据,只需调用这个

let data:[String: String] = ["data": "YourData"]
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: data)

关于Swift - 在协议(protocol)/委托(delegate)之间传递数据时出错(未找到),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45010185/

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