分配与 UIPickerView 上显示的不同的输出值

Assigning a different output value than what is shown on UIPickerView

我昨天在这个网站上搜索了整整一个答案,但我没能找到这个。我是一名业余编码员,实际上只是为一家小型组织做这件事,看看我们是否可以帮助改进流程。

这就是我想要做的。我正在尝试制作一个应用程序,允许某人 select 一个帐号,一项任务,然后它会输出一个数字作为完整的帐号,他们可以将其放在收据上。

例如,某人 select 的帐号为 12345678910,他们 select "cleaning the bathroom"。我希望该应用吐出一个完整的帐号,如 12345678910 58392,其中 58932 与 "cleaning the bathroom" 关联,但实际上并未显示在 PickerView 上。我在这方面遇到了麻烦。编码是我一直想学的东西,但一直在业余时间做,所以如果有错误,请原谅业余爱好。为此,我一直在使用 YouTube 视频。

感谢任何帮助。非常感谢! Sample app screen-shot

import UIKit

class Account {
    var account: String
    var jlCode: [String]

    init(account:String, jlCode:[String]) {
        self.jlCode = jlCode
        self.account = account
    }
}

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    @IBOutlet weak var pickerView: UIPickerView!
    @IBOutlet weak var accountLbl: UILabel!

    var accounts = [Account]()

    @IBAction func showPopup(_ sender: Any) {
        let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "sbPopUpID") as! PopUpViewController
        self.addChildViewController(popOverVC)

        popOverVC.view.frame = self.view.frame
        self.view.addSubview(popOverVC.view)

        popOverVC.didMove(toParentViewController: self)
    }

    override func viewDidLoad() {

        pickerView.delegate = self
        pickerView.dataSource = self

        //This area will have to be changed once you get the right information.

        accounts.append(Account(account: "12345678910", jlCode: ["task 1", "task 2", "task 3", "task 4"]))
        accounts.append(Account(account: "1112131415", jlCode: ["Task 1"]))
        accounts.append(Account(account: "1617181920", jlCode: ["task 1", "task 2", "task 3", "task 4"]))
        accounts.append(Account(account: "2122232425", jlCode: ["task 1", "task 2", "task 3", "task 4"]))

        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 2
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if component == 0 {
            return accounts.count
        } else {
            let selectedAccount = pickerView.selectedRow(inComponent: 0)
            return accounts[selectedAccount].jlCode.count
        }
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if component == 0 {
            return accounts[row].account
        } else {
            let selectedAccount = pickerView.selectedRow(inComponent: 0)
            return accounts[selectedAccount].jlCode[row]
        }
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        pickerView.reloadComponent(1)

        let selectedAccount = pickerView.selectedRow(inComponent: 0)
        let selectedjlCode = pickerView.selectedRow(inComponent: 1)
        let account = accounts[selectedAccount].account
        let jlCode = accounts[selectedAccount].jlCode[selectedjlCode]

        accountLbl.text = "Account Number: \(account)\nJL Code: \(jlCode)"
    }
}

如果,那是一个很大的IF,我对你的理解是正确的你的问题是你没有任何连接的描述具有与任务关联的数值的任务。换句话说,您似乎只是在为数据建模而苦苦挣扎。

我认为类似下面的内容可能会帮助您朝着正确的方向前进:

struct Account {
    var number: Int
    var tasks: [Task]

    var description: String { return "\(number)" }
}

struct Task {
    var number: Int // or JLNumber, or whatever you want to call it
    var description: String
}

这会让您像这样设置帐户:

let account = Account(number: 12345678910, tasks: [Task(number: 58932, description: "Cleaning the bathroom")])

您将在 pickerView 中显示 .description,并在有意义的地方使用 .number

如果任务的不同类型预定义的,(即,如果不更改代码,它们将永远不会更改)你应该有一个查看 enums 而不是使用字符串和整数即时创建它们...