gpt4 book ai didi

swift - macOS Swift 主从委托(delegate)/协议(protocol)不起作用

转载 作者:行者123 更新时间:2023-11-28 07:50:42 26 4
gpt4 key购买 nike

这道题一定很简单,但我是新手。我有一个 splitView,我试图将其作为主从关系进行管理。用户单击 Master 中的 OutlineView 项,这会触发更新 Detail 端 PopUp 按钮内容的需要。我已经尝试了几个较大代码中的安排测试,从中提取了下面的代码(参见下面代码中标记的测试 1、测试 2、测试 3、测试 4。失败的是测试 3,它失败是因为 displayListPopUP当它被委托(delegate)调用时,它在协议(protocol)函数中为 nil,尽管当类 DetailViewController 最初使用相同的指令加载 PopUp 时它不是 nil。如何修复 TEST 3?

import Cocoa

var displayList: [String] = []

class MasterViewController: NSViewController {

weak var delegate: detailViewControllerDelegate?
let detailViewController = DetailViewController()

override func viewDidLoad() {
super.viewDidLoad()
displayList = ["Problem(s) in Selected Category","EM3", "EM4"]
self.delegate = detailViewController as detailViewControllerDelegate

// TEST 1---THIS WORKS (Bingo is printed)
delegate?.testPrint(val: "Bingo")
}

extension MasterViewController: NSOutlineViewDelegate {

func outlineViewSelectionDidChange(_ notification: Notification){

displayList = ["Problem(s) in Selected Category","EM1", "EM2"]

// TEST 2---THIS WORKS (Bingo 2 is printed)
delegate?.testPrint(val: "Bingo 2")

// TEST 3---THIS DOESN'T WORK (displayListPopUP is nil)
delegate?.loadListPopUP(list: displayList)
}
}

protocol detailViewControllerDelegate: class {
func testPrint(val: String)
func loadListPopUP(list: [String])
}


class DetailViewController: NSViewController, detailViewControllerDelegate {

//I CHECK, XCODE SAYS THIS OUTLET IS ACTIVE
@IBOutlet weak var displayListPopUP: NSPopUpButton!

override func viewDidLoad() {
super.viewDidLoad()

//TEST 4---THIS WORKS (PopUp button is loaded correctly)
displayListPopUP.removeAllItems()
displayListPopUP.addItems(withTitles: displayList)
}

func testPrint(val: String){
print(val)
}

func loadListPopUP(list: [String]){
//THIS DOES NOT WORK. displayListPopUP is nil when called from delegate
displayListPopUP.removeAllItems()
displayListPopUP.addItems(withTitles: list)
}

最佳答案

这似乎解决了问题:

var detailViewController = DetailViewController()
weak var delegate: detailViewControllerDelegate?

override func viewDidLoad() {
super.viewDidLoad()

...

detailViewController =

self.storyboard?.instantiateController(withIdentifier: "detailVC") 作为! NSViewController 作为!细节 View Controller

 // This is a trick to force the detailViewController to load its hierarchy     view, icluding displayListPopUP

_ = detailViewController.view

...

确实,xcode 确实显示了我的 PopUp 的事件导出。 DetailViewController 的初始显示显然是由 macOS 管理的,它有自己的 View 实例化。因此测试 4 确实有效。

创建主从关系显然需要我的 DetailViewController 的新实例化。因为我使用的是 Storyboard,nibs 和 xibs,如果它们存在的话,是眼不见心不烦的。因此,@OOper 的实例化必须替换为显示的实例化。但是,他是对的,实例化不会加载 View 层次结构。那时测试 3 将失败,因为 displayPopUP 仍然为零。 View 层次结构在第一次引用 View 后加载,显示的虚拟调用强制加载层次结构,displayPopUP 现在处于事件状态。测试 3 现在成功了。

关于swift - macOS Swift 主从委托(delegate)/协议(protocol)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49787805/

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