カスタムテーブルビューセルにUITextFieldがあります。ユーザーがセル(またはUITextField)のいずれかを押すと、キーパッドの代わりにピッカービューが表示されます。これを実現するために、テキストフィールドの「inputview」プロパティと「accesoryview」プロパティを使用しています。
はい。したがって、セルを選択すると、ピッカービューがそのピッカー値とともに表示されます。ただし、テキストフィールド自体(セル内にある)を選択すると、ピッカービューは表示されますが、ピッカー値は表示されません。 .iピッカービューに空のセルが1つだけ表示されます。
ユーザーがテキストフィールドまたはセルのどちらを押しても、まったく同じことが起こるようにするには、どのアプローチを使用する必要がありますか(つまり、ピッカービューがピッカー値とともに表示されます)。何がこの問題を引き起こしているのかは明らかですか?
TableViewCellのUITextfield。UIPickerViewを表示する
コードからすべての混乱を取り除き、質問に関連する部分だけを残しました(関連するコードを省略していないことを願っています):
import UIKit
class EditProfileViewController: UIViewController, UITableViewDelegate,UITableViewDataSource, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate,UITextViewDelegate {
let properties = ["Name","Birthday","Diet"]
let diets:NSArray = ["Vegan","Plant-based","Vegetarian","Meat Eater"]
var userEditProfileTable : UITableView!
var reminderCells = (1...3).map{ _ in EditProfileTableViewCell()}
var toolBar : UIToolbar!
var i:Int!
var myUIPicker = UIPickerView()
var editorViewController: EditorViewController!
var myValues: NSArray!
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.blue
let barHeight: CGFloat = UIApplication.shared.statusBarFrame.size.height
let displayWidth: CGFloat = self.view.frame.width
let displayHeight: CGFloat = self.view.frame.height
userEditProfileTable = UITableView(frame: CGRect(x: 0, y: barHeight, width: displayWidth, height: displayHeight - barHeight))
userEditProfileTable.delegate = self
userEditProfileTable.dataSource = self
userEditProfileTable.rowHeight = 40
userEditProfileTable.register(EditProfileTableViewCell.self, forCellReuseIdentifier: "cellId")
self.userEditProfileTable.reloadData()
self.view.addSubview(userEditProfileTable)
}
func generalPicker(){
myUIPicker.becomeFirstResponder()
self.myUIPicker.delegate = self
self.myUIPicker.dataSource = self
}
@objc func donePicker() {
reminderCells[i].valueTextField.resignFirstResponder()
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
reminderCells[indexPath.item].valueTextField.becomeFirstResponder()
i = indexPath.item
print(properties[indexPath.item])
switch properties[indexPath.item] {
case "Name":
print("jkehdfgjdhj")
case "Birthday":
print("jhkjhjh")
case "Diet":
myValues = diets
generalPicker()
print(properties[indexPath.item])
default:
print("Some other character")
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// retuen no of rows in sections
return properties.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// retuen your custom cells
print(indexPath)
let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as! EditProfileTableViewCell
cell.backgroundColor = UIColor.clear
cell.property.text = properties[indexPath.item]
cell.isUserInteractionEnabled = true
cell.valueTextField.isUserInteractionEnabled = true
cell.valueTextField.delegate = self
toolBar = UIToolbar()
toolBar.sizeToFit()
switch properties[indexPath.item]{
case "Birthday":
print("bonita")
case "Diet":
let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: #selector(donePicker))
toolBar.setItems([doneButton], animated: false)
cell.valueTextField.inputAccessoryView = toolBar
cell.valueTextField.inputView = myUIPicker
default:
print("mamacita")
}
reminderCells[indexPath.item] = cell
return cell
}
// data method to return the number of column shown in the picker.
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
// data method to return the number of row shown in the picker.
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
print(myValues.count)
return myValues.count
}
// delegate method to return the value shown in the picker
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
print("mjkhjkhkj")
print(myValues[row])
return myValues[row] as? String
}
// delegate method called when the row was selected.
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
print("row: \(row)")
print("value: \(myValues[row])")
reminderCells[i].valueTextField.text = myValues[row] as? String
}
}
didSelectでピッカーのデータソースを設定し、テキストフィールドに追加する必要があります。この行を委任しますmyValues = Diets
// UITextField Delegates
func textFieldDidBeginEditing(_ textField: UITextField) {
myValues = diets // be addedd
generalPicker()
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加