【问题标题】:multiple pickerview didSelectRow error in SwiftSwift中的多个pickerview didSelectRow错误
【发布时间】:2020-04-23 19:19:37
【问题描述】:

我有 2 个选择器视图,1 个选择器视图用于从数组中选择一种加密货币,另一个选择器视图用于从数组中选择一种货币。我遇到的问题是,当我在模拟器上运行应用程序并在 cryptoPicker 中选择加密货币时,该应用程序还会从 currencyPicker 中选择相同的数组值,反之亦然。除非用户选择,否则我不希望从两个数组中提取 0 的数组值。

@IBOutlet weak var cryptoCurrentRate: UILabel!
@IBOutlet weak var currencyLabel: UILabel!
@IBOutlet weak var currencyPicker: UIPickerView!
@IBOutlet weak var cryptoPicker: UIPickerView!
@IBOutlet weak var cryptoLabel: UILabel!


var coinManager = CoinManager()


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    coinManager.delegate = self
    currencyPicker.dataSource = self
    currencyPicker.delegate = self
    cryptoPicker.dataSource = self
    cryptoPicker.delegate = self   

}

}

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


    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if pickerView == currencyPicker {
        return coinManager.currencyArray.count
        }
        if pickerView == cryptoPicker {
        return coinManager.cryptoArray.count
    }
        return 0
    }
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView == currencyPicker {
        return coinManager.currencyArray[row]
        }
        if pickerView == cryptoPicker {
        return coinManager.cryptoArray[row]
    }
        return ""
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        let selectedCurrency = coinManager.currencyArray[row]
        let selectedCrypto = coinManager.cryptoArray[row]
        coinManager.fetchCryptoCoin(assetIdBase: selectedCrypto, assetIdQuote: selectedCurrency)
    }

}

【问题讨论】:

    标签: swift uipickerview xcode11.4


    【解决方案1】:

    对picker和'didSelectRow'做同样的检查,你可以这样做:

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
         var selectedCurrency: CurrencyModel? = nil
         var selectedCrypt: CryptModel? = nil
    
    
        if pickerView == currencyPicker {
            selectedCurrency = coinManager.currencyArray[row]
        }
        if pickerView == cryptoPicker {
            selectedCrypto = coinManager.cryptoArray[row]
        }
    
        coinManager.fetchCryptoCoin(assetIdBase: selectedCrypt == nil ? coinManager.cryptoArray[.zero] : selectedCrypt!, assetIdQuote: selectedCurrency == nil ? coinManager.currencyArray[.zero] : selectedCurrency!)
    }
    

    默认情况下,它会从 'coinManager.currencyArray' 或 'coinManager.cryptoArray' 中获取第一个值

    【讨论】:

    • 抱歉回复晚了,我试过了,但最终还是出现了在每个选择器上显示同一行的错误。因此,如果在选择器 1 上选择了第 1 行,那么它也在选择器 2 上被选择。我最终只是将 selectedCurrency 和 selectedCrypt 都放在了 1 个选择器(同一个选择器)上,因为这种方法更容易实现我的目标。但我想知道如何为可能的未来项目做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多