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

时间:2017-03-19 18:05:31

标签: swift cocoa swift3

我真的很难将一个数组的内容从视图控制器传递到另一个数组来设置nscombobox的内容。我已经尝试了我能想到的一切,为segue做准备,init;但似乎没什么用。 程序流程如下:用户在文本字段中输入一个数字,并在此基础上创建一个数字大小的数组。一旦用户按下按钮,就会出现下一个具有组合框的VC,并且在该组合框内需要显示这些数字。我的所有尝试都会导致传递一个空数组。有人可以请一点时间帮助我。我确定我犯了一个愚蠢的错误,但无法弄清楚是什么。 代码清单如下: 接受用户输入的类。在这个阶段,我试图在下一个类中传递数组的内容,因为我放弃准备segue,因为那个因为nil错误而崩溃。请注意,在代码清单中取消注释准备segue仅用于格式化目的。在我的程序中它被注释掉了,因为我现在正在使用perform 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]
    } 
}

1 个答案:

答案 0 :(得分:0)

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

student_id

我假设你认为你在这里创建的viewController传递给let declareNumberOfRoomsVC = SetNumberOfRoomsForFloorVC(boxData: declaredFloorsArray) declareNumberOfRoomsVC.boxData = declaredFloorsArray 。但是故事板会为您实例化一个新的viewController。

之后你需要将prepareForSegue设置为declaredFloorsArray中新viewController的boxData,你应该好好去。