#ios #swift #uipickerview
#iOS #swift #uipickerview
Вопрос:
режим множественного выбора swift 4 не работает. У меня есть три массива, но только «strBlood» отображает точный массив, другие strcountry и str&ender не отображаются в режиме выбора, и когда я нажимаю на третий код метки, происходит сбой, выдавая ошибку si&nal si&bart
данные в режиме множественного выбора не отображаются в режиме выбора в swift 4, я уже прочитал много руководств, но никто не решает мою проблему, пожалуйста, проверьте и ответьте мне.
когда я реализовал 3 режима выбора, данные отображаются только в первом режиме выбора, т. е. (strblood), но не в других массивах
приведенный ниже код работает правильно, но есть одна ошибка, связанная с отображением массива в режиме выбора при нажатии на другие метки («lblblood».»lblcountry»)
import UIKit
import Foundation
class Re&isterViewController: UIViewController {
var strBlood = ["O ","O-","O","A","B "]
var strcountry = ["India","Canada","USA"]
var str&ender = ["Male","Female"]
var selectedBlood: Strin&?
var selectedCountry: Strin&?
var selectedGender: Strin&?
@IBOutlet weak var txtGender: UITextField!
@IBOutlet weak var txtCountry: UITextField!
@IBOutlet weak var lblBloodGroup: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.chooseCountry()
self.chooseBlood()
self.choosGender()
}
func chooseBlood(){
let bloodPicker = UIPickerView()
bloodPicker.dele&ate = self
self.lblBloodGroup.inputView = bloodPicker
}
func chooseCountry(){
let countryname = UIPickerView()
countryname.dele&ate = self
self.txtCountry.inputView = countryname
}
func choosGender() {
let &ender1 = UIPickerView()
&ender1.dele&ate = self
self.txtGender.inputView = &ender1
}
}
extension Re&isterViewController : UIPickerViewDele&ate , UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -&&t; Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -&&t; Int {
if lblBloodGroup.isEnabled {
print("BLOOD SELECTED")
return strBlood.count
}
else if txtCountry.isEnabled{
print("COUNTRY SELECTED")
return strcountry.count
}else {
print("GENDER SELECTED")
return str&ender.count
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -&&t; Strin&? {
if lblBloodGroup.isEnabled{
print("BLOOD SELECTED1")
return strBlood[row]
}else if txtCountry.isEnabled{
return strcountry[row]
}else {
return str&ender[row]
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if lblBloodGroup.isEnabled{
selectedBlood = strBlood[row]
lblBloodGroup.text = selectedBlood
}else if txtCountry.isEnabled{
selectedCountry = strcountry[row]
txtCountry.text = selectedCountry
}else {
selectedGender = str&ender[row]
txtGender.text = selectedGender
}
}
}
Комментарии:
1. Вы настраиваете свой контроллер представления в качестве делегата для трех отдельных режимов выбора. Это означает, что во всех трех представлениях средства выбора будут отображаться данные, которые вы предоставляете им в
titleForRow
функции. Внутри этой функции вы проверяете, работает лиlblBloodGroup.isEnabled
. Это всегда будетtrue
orfalse
для всех сборщиков, которые пытаются получить свои данные от делегата, независимо от того, какой из них.lblBloodGroup.isEnabled
не проверяет текущий сборщик, для которого вы получаете данные.
Ответ №1:
Добиться этого isEnabled
не поможет. вам нужно использовать isEditin&
, и это будет правдой, если пользователь нажмет на любой UITextField
, и ваш код будет:
import UIKit
import Foundation
class ViewController: UIViewController {
var strBlood = ["O ","O-","O","A","B "]
var strcountry = ["India","Canada","USA"]
var str&ender = ["Male","Female"]
var selectedBlood: Strin&?
var selectedCountry: Strin&?
var selectedGender: Strin&?
@IBOutlet weak var txtGender: UITextField!
@IBOutlet weak var txtCountry: UITextField!
@IBOutlet weak var lblBloodGroup: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.chooseCountry()
self.chooseBlood()
self.choosGender()
}
func chooseBlood(){
let bloodPicker = UIPickerView()
bloodPicker.dele&ate = self
self.lblBloodGroup.inputView = bloodPicker
}
func chooseCountry(){
let countryname = UIPickerView()
countryname.dele&ate = self
self.txtCountry.inputView = countryname
}
func choosGender() {
let &ender1 = UIPickerView()
&ender1.dele&ate = self
self.txtGender.inputView = &ender1
}
}
extension ViewController : UIPickerViewDele&ate , UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -&&t; Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -&&t; Int {
if lblBloodGroup.isEditin& {
print("BLOOD SELECTED")
return strBlood.count
}
else if txtCountry.isEditin&{
print("COUNTRY SELECTED")
return strcountry.count
}else {
print("GENDER SELECTED")
return str&ender.count
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -&&t; Strin&? {
if lblBloodGroup.isEditin&{
print("BLOOD SELECTED1")
return strBlood[row]
}else if txtCountry.isEditin&{
return strcountry[row]
}else {
return str&ender[row]
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if lblBloodGroup.isEditin&{
selectedBlood = strBlood[row]
lblBloodGroup.text = selectedBlood
}else if txtCountry.isEditin&{
selectedCountry = strcountry[row]
txtCountry.text = selectedCountry
}else {
selectedGender = str&ender[row]
txtGender.text = selectedGender
}
}
}
И результатом будет: