【问题标题】:Issues passing data from uipickerview to uilabel将数据从 uipickerview 传递到 uilabel 的问题
【发布时间】:2021-12-19 03:36:00
【问题描述】:

我在按“完成”时从选择器中获取所选结果以显示在我的描述中时遇到问题。运行应用程序时,描述将打印 ["Male", "Female"]。最终结果应该只将所选选项插入描述中。

我是 swift 新手,不确定自己做错了什么才能得到这个结果。对此的任何帮助将不胜感激。代码如下:

类 OnboardingViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

@IBOutlet weak var collectionView: UICollectionView!
@IBOutlet weak var pageControl: UIPageControl!
@IBOutlet weak var NextButton: UIButton!
@IBOutlet weak var Description: UILabel!

let gender = ["Male", "Female"]

var genderPicker = UIPickerView()
var toolBar = UIToolbar()

var slides: [OnboardingSlide] = []

override func viewDidLoad() {
    super.viewDidLoad()

    NextButton.layer.cornerRadius = NextButton.frame.width / 2
    NextButton.layer.masksToBounds = true
    NextButton.alpha = 0
    
    Description.text = "An ideal daily intake of calories varies depending on age, metabolism and levels of physical activity, among other things. Generally, the recommended daily calorie intake is 2,000 calories a day for women and 2,500 for men."

    Description.numberOfLines = 0
    Description.lineBreakMode = .byTruncatingTail
    view.addSubview(Description)
    
}

@IBAction func genderSelectButton(_ sender: UIButton) {

        genderPicker = UIPickerView.init()
        genderPicker.delegate = self
        genderPicker.dataSource = self
        genderPicker.backgroundColor = UIColor.white
        genderPicker.setValue(UIColor.black, forKey: "textColor")
        genderPicker.autoresizingMask = .flexibleWidth
        genderPicker.contentMode = .center
        genderPicker.frame = CGRect.init(x: 0.0, y: UIScreen.main.bounds.size.height - 300, width: UIScreen.main.bounds.size.width, height: 300)
        self.view.addSubview(genderPicker)
                
        toolBar = UIToolbar.init(frame: CGRect.init(x: 0.0, y: UIScreen.main.bounds.size.height - 300, width: UIScreen.main.bounds.size.width, height: 50))
        toolBar.items = [UIBarButtonItem.init(title: "Done", style: .done, target: self, action: #selector(onDoneButtonTapped))]
        self.view.addSubview(toolBar)
    
    Description.alpha = 0
    
}

@objc func onDoneButtonTapped() {
    toolBar.removeFromSuperview()
    genderPicker.removeFromSuperview()
    Description.text = "You are \(gender)."
    Description.alpha = 100
    NextButton.alpha = 100
    
}

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

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return gender.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return gender[row]
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    Description.text = gender[row]
    print(gender[row])
}

@IBAction func nextButtonClicked(_ sender: Any) {
}

【问题讨论】:

    标签: swift uipickerview


    【解决方案1】:

    您可以收听pickerView(_:didSelectRow:inComponent) 并在用户更改选择时记录行值,或者在用户点击您的完成按钮时询问选择器选择的行(使用selectedRow(inComponent:) 方法)。

    您的Description.text = "You are \(gender)." 代码没有意义,因为gender 似乎是一组性别值。我希望它能够读取Description.text = "You are \(gender[selectedRow])."(假设您将选定的行保存到实例变量selectedRow。)

    请注意,实例变量应以小写字母开头,类型应以大写字母开头。因此Description 应该是description

    在 Swift 中有一个严格的约定来一致地使用大小写(类和类型名称应该大写“驼峰式”,变量和值应该用小驼峰式命名。

    另一个想法:

    我建议将 Gender 设为枚举:

    enum Gender: String, CaseIterable {
       case male
       case female
    }
    

    然后您可以使用 Gender.allCases[index] 使用基于 0 的索引获取性别并使用获取性别的字符串值

    let aGender: Gender = .male
    let genderName: String = aGender.rawValue
    

    您还可以使用Gender(rawValue:) 从字符串创建性别。考虑这段代码:

    func genderFromString(_ aString: String) {
        if let genderFromString = Gender(rawValue: aString) {
            print("genderFromString for '\(aString)' = \(genderFromString)")
        } else {
            print("Can't convert '\(aString)' to a Gender")
        }
    }
    
    genderFromString("male")
    
    genderFromString("Wombat")
    

    输出:

    genderFromString for 'male' = male
    Can't convert 'Wombat' to a Gender
    

    【讨论】:

    • 非常感谢您对代码的反馈。我听了pickerview didSelect的方式,它现在按预期工作。在实例变量的大小写上注明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    相关资源
    最近更新 更多