在Uipickerview中创建3列,还使用附录函数



这是我试图为一家小公司开发的应用程序的另一个问题。本质上,我想让人们更容易找到帐号。Pickerview中的第一列本质上是部门。第二个将是他/她要做的任务,第三个将是位置。我已经弄清楚了如何在视觉上制作3列,但是我不知道如何将其放入代码中。这样,我的意思是如何实际设置第三列的值/选择。此外,我遇到了一些问题,试图将其与.Append函数联系起来,以便仅在列中使用某些选择显示某些选项。附加功能不是必需的,但是如果可能的话,可以使用它。

这是我编码的第一个应用程序,我"训练了自己",因此,如果有的话,我的业余失误。任何帮助都将受到赞赏。

import UIKit
cllass Account {
var account: String
var jlCode: [String]
var location: [[String]]
init(account:String, jlCode:[String], location:[[String]]) {
    self.jlCode = jlCode
    self.account = account
    self.location = location
    }
}
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet weak var pickerView: UIPickerView!
@IBOutlet weak var accountLbl: UILabel!
@IBOutlet weak var infoLbl: UILabel!
@IBOutlet weak var imageView: UIImageView!
var accounts = [Account]()
override func viewDidLoad() {
    pickerView.delegate = self
    pickerView.dataSource = self
    infoLbl.text = """
    test
    """
    //A. PARKS - Tasks for account number 12345678910
    accounts.append(Account(account: "12345678910", jlCode: ["task 1"], location: [["here"]]))
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 3
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if component == 0 {
        return accounts.count
    } else if component == 1 {
        let selectedAccount = pickerView.selectedRow(inComponent: 0)
        return accounts[selectedAccount].jlCode.count
    } else if component == 2 {
        let selectedAccount = pickerView.selectedRow(inComponent: 0)
        let selectedjlCode = pickerView.selectedRow(inComponent: 1)
        let location = pickerView.selectedRow(inComponent: 2)
        return accounts[selectedAccount].jlCode[selectedjlCode].location.count
    }
    return 3
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if component == 0 {
        return accounts[row].account
    } else if component == 1 {
        let selectedAccount = pickerView.selectedRow(inComponent: 0)
        return accounts[selectedAccount].jlCode[row]
    } else if component == 2 {
        let selectedAccount = pickerView.selectedRow(inComponent: 0)
        let selectedjlCode = pickerView.selectedRow(inComponent: 1)
        let selectedLocation = pickerView.selectedRow(inComponent: 2)
        return accounts[selectedAccount].jlCode[selectedjlCode].location[selectedLocation]
    }
    return nil
}
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)"
}
}

看来您的 titleForRow函数在某种程度上缺乏。您当前仅服务组件0(帐户(和...任何不是不是帐户的东西。您需要更加明确并相应地交付文本。

在途中帮助您,并使您更容易理解发生的事情,我建议您在班级的顶部创建这些常数?

private let accountsComponent = 0
private let tasksComponent = 1
private let locationsComponent = 2

然后,您应该更改标题函数以适应上述所有任务:

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if component == accountsComponent {
        return accounts[row].account
    } else if component == tasksComponent {
        let selectedAccount = pickerView.selectedRow(inComponent: accountsComponent)
        return accounts[selectedAccount].jlCode[row]
    } else if component == locationsComponent {
        // THIS IS WHAT IS MISSING
        // You need to return the location strings from this place.
    }
    return nil
}   

您需要从if component == locationsComponent部分返回适当的字符串...

[edit2]好的,由于您刚开始,我会加倍努力:显而易见的是,您已经掌握了numberOfRowsInComponenttitleForRow函数的目的(?(

numberOfRows告诉组件每个组件("列"(包含多少个值titleForRow是您返回每个组件中每行应显示的实际文本串。

因此,正如我在评论中提到的那样,创建一个位置结构:

struct Location {
    var identifier: Int
    var label: String
}

在您的控制器中,创建此结构的数组。

let locations: [Location] = [Location(identifier: 1, label: "Outdoors"),
                             Location(identifier: 2, label: "Indoor"),
                             Location(identifier: 3, label: "Narnia")]

然后,您的NumberoFrows应该依靠此数组,以返回位置组件的适当的行数:

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    // Only including the parts to return the location-stuff 
    } else if component == 2 {
        return locations.count
    }
    return 0 // This will never be reached as long as the numberOfComponents returns 3
}

和titleforrow:

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    // Only including the parts to return the location-stuff 
    } else if component == 2 {
        return locations[row].label
    }
    return nil
} 

最新更新