[英]Delegation Pattern in Swift 4 doesn't work! Can anyone explain the correct delegate pattern in Swift 4?
為什么此委托模式不起作用? 在DelegateViewController中選擇一個Button后,我想在第二個ViewController中顯示name屬性(標簽出口)
我已完成以下步驟:
在“老板” ViewController中創建協議-> DelegateViewController
將我的功能分配給該協議-> selectedButton
DelegateViewController:
import UIKit
protocol SelectionDelegate {
func selectedButton(name: String)
}
class DelegateViewController: UIViewController {
var selectionButtonDelegate: SelectionDelegate!
@IBAction func bayernButton(_ sender: UIButton) {
selectionButtonDelegate.selectedButton(name: "Bayern")
}
@IBAction func dortmundButton(_ sender: UIButton) {
selectionButtonDelegate.selectedButton(name: "Dortmund")
}
}
ViewController:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var selectedButton: UILabel!
let model = DelegateViewController()
override func viewDidLoad() {
super.viewDidLoad()
model.selectionButtonDelegate = self
}
}
extension ViewController: SelectionDelegate {
func selectedButton(name: String) {
selectedButton.text = name
}
}
通過查看代碼問題,您的實現看起來不錯
let model = DelegateViewController()
您正在創建一個DelegateViewController
的新實例,但是您必須單擊DelegateViewController
控制器的其他某個實例中的按鈕。
您可能需要獲取正確的model
實例,而不是創建一個新的model
,或者應該從新創建的View Controller實例中點擊按鈕。
示例:可能需要做類似的事情
class ViewController: UIViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
if let navigationController = segue.destination as? DelegateViewController {
selectionButtonDelegate = self = self
}
}
}
您沒有將selectionButtonDelegate分配給當前活動的DelegateViewController。 修改您的代碼以訪問DelegateViewController的當前實例。
import UIKit
protocol SelectionDelegate {
func selectedButton(name: String)
}
class DelegateViewController: UIViewController {
static weak var shared: DelegateViewController!
weak var selectionButtonDelegate: SelectionDelegate!
override func viewDidLoad() {
super.viewDidLoad()
DelegateViewController.shared = self
}
@IBAction func bayernButton(_ sender: UIButton) {
selectionButtonDelegate.selectedButton(name: "Bayern")
}
@IBAction func dortmundButton(_ sender: UIButton) {
selectionButtonDelegate.selectedButton(name: "Dortmund")
}
}
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var selectedButton: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
DelegateViewController.shared.selectionButtonDelegate = self
}
}
extension ViewController: SelectionDelegate {
func selectedButton(name: String) {
selectedButton.text = name
}
}
同樣在大多數情況下,在Swift中聲明委托變量之前,請先使用weak,以避免內存泄漏。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.