gpt4 book ai didi

swift - 如何使用prepare for segue 或init 设置NSComboBox?

转载 作者:行者123 更新时间:2023-11-30 12:35:43 25 4
gpt4 key购买 nike

我真的很难将一个数组的内容从 View Controller 传递到另一个数组以设置 nscombobox 的内容。我已经尝试了所有我能想到的,准备segue,init;但似乎没有任何作用。程序流程如下:用户在文本字段中输入一个数字,并根据该数字创建一个具有该数字大小的数组。一旦用户按下按钮,下一个 VC 就会出现,其中有一个组合框,并且在该组合框中需要出现这些数字。我所有的尝试都会导致传递一个空数组。有人可以花点时间帮我吗?我确信我犯了一个愚蠢的错误,但不知道是什么。代码 list 如下:接受用户输入的类。在这个阶段,我试图在下一类中传递数组的内容,因为我放弃了准备继续,因为该类因零错误而崩溃。请注意,出于格式化目的,代码 list 中未注释“pre​​pare for segue”。在我的程序中,它被注释掉了,因为我目前正在使用执行转场。任何解决方案都会很好。谢谢。

import Cocoa

class SetNumberOfFloorsVC: NSViewController {

//MARK: - Properties

@IBOutlet internal weak var declaredNumber: NSTextField!

internal var declaredFloorsArray = [String]()

private var floorValue: Int {
get {
return Int(declaredNumber.stringValue)!
}
}

//MARK: - Actions

override func viewDidLoad() {
super.viewDidLoad()
}

@IBAction private func setNumberOfFloors(_ sender: NSButton) {
if declaredNumber.stringValue.isEmpty {
let screenAlert = NSAlert.init()
screenAlert.messageText = "Please specify the number of floors!"
screenAlert.addButton(withTitle: "Got it!")
screenAlert.runModal()

} else if floorValue == 0 || floorValue < 0 {
let screenAlert = NSAlert.init()
screenAlert.messageText = "Please input a correct number of floors!"
screenAlert.addButton(withTitle: "Got it!")
screenAlert.runModal()
} else {
for i in 0...floorValue - 1 {
declaredFloorsArray.append(String(i))
}
print("\(declaredFloorsArray)")
let declareNumberOfRoomsVC = SetNumberOfRoomsForFloorVC(boxData: declaredFloorsArray)
declareNumberOfRoomsVC.boxData = declaredFloorsArray
performSegue(withIdentifier: "set number of rooms", sender: self)
}
}

override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
if segue.identifier == "set number of rooms" {
if let addRoomsVC = segue.destinationController as? SetNumberOfRoomsForFloorVC {
addRoomsVC.floorBox.addItems(withObjectValues: declaredFloorsArray)
}
}
}
}

这是下一个带有组合框的 VC 的类:

import Cocoa

class SetNumberOfRoomsForFloorVC: NSViewController, NSComboBoxDelegate, NSComboBoxDataSource {

//MARK: - Properties

@IBOutlet internal weak var floorBox: NSComboBox!

@IBOutlet private weak var numberOfRoomsTxtField: NSTextField!

internal var boxData = [String]()

//MARK: - Init

convenience init(boxData: [String]) {
self.init()
self.boxData = boxData
}

//MARK: - Actions

override func viewDidLoad() {
super.viewDidLoad()
floorBox.usesDataSource = true
floorBox.dataSource = self
floorBox.delegate = self
print("\(boxData)")
}

@IBAction private func setRoomsForFloor(_ sender: NSButton) {

}

//MARK: - Delegates

func numberOfItems(in comboBox: NSComboBox) -> Int {
return boxData.count
}
func comboBox(_ comboBox: NSComboBox, objectValueForItemAt index: Int) -> Any? {
return boxData[index]
}
}

最佳答案

首先您应该删除以下代码。

let declareNumberOfRoomsVC = SetNumberOfRoomsForFloorVC(boxData: declaredFloorsArray)
declareNumberOfRoomsVC.boxData = declaredFloorsArray

我假设您认为您在此处创建的 viewController 已传递给 prepareForSegue。但是 Storyboard会为您实例化一个新的 viewController。

之后,您需要在 prepareForSegue 中将您的 declaredFloorsArray 设置为新 viewController 的 boxData,然后就可以开始了。

关于swift - 如何使用prepare for segue 或init 设置NSComboBox?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42890180/

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