努力学习通过 delegates
传递数据的基础知识.我正在尝试从我的 viewController
传递一个字符串给我的viewController2
并打印出来。我收到错误消息:
"Type
ViewController2
has no memberdelagate
" in myview controller 2
.
我无法弄清楚我哪里出错了。
View Controller 1:protocol datadelagate { func printThisString(string: String) } class ViewController: UIViewController { var delegate: datadelagate? override func viewDidLoad() { delegate?.printThisString(string: "This was passed from first controller to second controller") } }
这是我的 View Controller 2:class ViewController2: UIViewController, datadelagate { func printThisString(string: String) { print(string) } override func viewDidLoad() { super.viewDidLoad() ViewController2.delagate = self print(String.self) } }
最佳答案
如果你想要ViewController2
从 ViewController
打印一些值,您可能必须这样做:
protocol datadelagate {
func printThisString(string: String)
func getStringFromVC1() -> String
}
class ViewController: UIViewController, datadelagate {
let someString: String = "From VC1"
func printThisString(string: String) {
print(string)
}
func getStringFromVC1() -> String {
return someString
}
override func viewDidLoad() {
ViewController2.delagate = self
}
}
class ViewController2: UIViewController {
var delegate: datadelagate?
override func viewDidLoad() {
super.viewDidLoad()
//This is how something from VC2 is sent to VC1's scope.
delegate?.printThisString(string: "Calling the delegate to print something from ViewController2 on first ViewController")
//The below call gets you some value from VC1. (This is what you wanted, I belive...)
print(delegate?.getStringFromVC1())
}
}
现在进行一些解释:
为便于理解,假设
delegate
作为从事某些特定工作的人( protocol
)。你有一个“委托(delegate)”
你要求你的委托(delegate)和你的 friend 一起工作,你的 friend 承认了。 (通过
You.delegate = self
分配您的委托(delegate),其中 self 是您的 friend )现在,通过您的
delegate
,您可以通过询问您的delegate
与您的 friend 一起做某事做一些工作(在 protocol
中定义)。编辑
上面的代码不起作用,因为非静态数据成员试图在不创建实例的情况下被访问
工作代码
import UIKit
class ViewController2: UIViewController {
static let sharedInstance = ViewController2()
weak var delegate: DataDelagate?
override func viewDidLoad() {
super.viewDidLoad()
//This is how something from VC2 is sent to VC1's scope.
delegate?.printThis(string: "Calling the delegate to print something from ViewController2 on first ViewController")
//The below call gets you some value from VC1. (This is what you wanted, I belive...)
print(delegate?.getStringFromVC1() ?? "s")
}
}
class ViewController: UIViewController {
static let sharedInstance = ViewController2()
var someString: String = "From VC1"
override func viewDidLoad() {
super.viewDidLoad()
ViewController2.sharedInstance.delegate = self
}
}
extension ViewController: DataDelagate {
func printThis(string: String) {
print(string)
}
func getStringFromVC1() -> String {
return someString
}
}
protocol DataDelagate: AnyObject {
func printThis(string: String)
func getStringFromVC1() -> String
}
关于ios - 通过委托(delegate)将数据传递给各种 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59436624/