swift - 如何从 Realm 设置 UIPickerView 选定值?
问题描述
我已经设置了一个视图控制器,其中有 7 个“问题”和 7 个“答案”。我创建了一个 UIPickerView,它允许用户在单击答案的 UITextField 时选择他们的答案,并将其保存在领域中。
但是,当用户已经选择了一个答案(例如:“同意”)时,当我单击该答案的 UITextField 时,“同意”不会显示为 UIPickerView 中的选定行。
如何将 UIPickerview 的默认值或“selectedrow”设置为 UITextField 中显示并保存在 Realm 中的答案?
import UIKit
import RealmSwift
class QuestionViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setupDelegateForPickerView()
setupDelegatesForTextFields()
}
override func viewWillAppear(_ animated: Bool) {
loadAnswers()
}
@IBOutlet weak var Question1TextField: UITextField!
@IBOutlet weak var Question2TextField: UITextField!
@IBOutlet weak var Question3TextField: UITextField!
@IBOutlet weak var Question4TextField: UITextField!
@IBOutlet weak var Question5TextField: UITextField!
@IBOutlet weak var Question6TextField: UITextField!
@IBOutlet weak var Question7TextField: UITextField!
// Setting up a UIPickerview from the ToolbarPickerView class
let realm = try! Realm()
var answers: Results<Answer>?
var answerArray = [UITextField]()
func loadAnswers() {
var answersGiven = realm.objects(Answer.self).filter("id = 1")
for answer in answersGiven {
Question1TextField.text = answer.Answer1
Question2TextField.text = answer.Answer2
Question3TextField.text = answer.Answer3
Question4TextField.text = answer.Answer4
Question5TextField.text = answer.Answer5
Question6TextField.text = answer.Answer6
Question7TextField.text = answer.Answer7
}
}
let pickerView = ToolbarPickerView()
let Menu = ["Strongly Disagree",
"Disagree",
"Neutral",
"Agree",
"Strongly Agree"]
var selectedMenu : String?
func setupDelegatesForTextFields() {
//appending textfields in an array
answerArray += [Question1TextField, Question2TextField, Question3TextField, Question4TextField, Question5TextField, Question6TextField, Question7TextField]
//using the array to set up the delegates, inputview for pickerview and also the inputAccessoryView for the toolbar
for answer in answerArray {
answer.delegate = self
answer.inputView = pickerView
answer.inputAccessoryView = pickerView.toolbar
}
}
func setupDelegateForPickerView() {
pickerView.dataSource = self
pickerView.delegate = self
pickerView.toolbarDelegate = self
}
func setDefaultValue(item: String, inComponent: Int){
if let indexPosition = Menu.firstIndex(of: item){
pickerView.selectRow(indexPosition, inComponent: inComponent, animated: true)
}
}
// Dismissing Keyboard on tapped
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
}
extension QuestionViewController : UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
self.pickerView.reloadAllComponents()
}
}
extension QuestionViewController : UIPickerViewDelegate, UIPickerViewDataSource {
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return self.Menu.count
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return self.Menu[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let answer = Answer()
answer.id = 1
// Check if the textfield isFirstResponder.
if Question1TextField.isFirstResponder {
Question1TextField.text = self.Menu[row]
answer.Answer1 = Question1TextField.text
try! realm.write {
realm.create(Answer.self, value: ["id": 1, "Answer1": self.Menu[row]], update: .modified)
}
} else if Question2TextField.isFirstResponder {
Question2TextField.text = self.Menu[row]
answer.Answer2 = Question2TextField.text
try! realm.write {
realm.create(Answer.self, value: ["id": 1, "Answer2": self.Menu[row]], update: .modified)
}
} else if Question3TextField.isFirstResponder {
Question3TextField.text = self.Menu[row]
answer.Answer3 = Question3TextField.text
try! realm.write {
realm.create(Answer.self, value: ["id": 1, "Answer3": self.Menu[row]], update: .modified)
}
} else if Question4TextField.isFirstResponder {
Question4TextField.text = self.Menu[row]
answer.Answer4 = Question4TextField.text
try! realm.write {
realm.create(Answer.self, value: ["id": 1, "Answer4": self.Menu[row]], update: .modified)
}
} else if Question5TextField.isFirstResponder {
Question5TextField.text = self.Menu[row]
answer.Answer5 = Question5TextField.text
try! realm.write {
realm.create(Answer.self, value: ["id": 1, "Answer5": self.Menu[row]], update: .modified)
}
} else if Question6TextField.isFirstResponder {
Question6TextField.text = self.Menu[row]
answer.Answer6 = Question6TextField.text
try! realm.write {
realm.create(Answer.self, value: ["id": 1, "Answer6": self.Menu[row]], update: .modified)
}
} else if Question7TextField.isFirstResponder {
Question7TextField.text = self.Menu[row]
answer.Answer7 = Question7TextField.text
try! realm.write {
realm.create(Answer.self, value: ["id": 1, "Answer7": self.Menu[row]], update: .modified)
}
} else {
//log errors
}
}
}
extension QuestionViewController: ToolbarPickerViewDelegate {
func didTapDone() {
let row = self.pickerView.selectedRow(inComponent: 0)
self.pickerView.selectRow(row, inComponent: 0, animated: false)
selectedMenu = self.Menu[row]
self.view.endEditing(true)
}
func didTapCancel() {
self.view.endEditing(true)
}
}
这是工具栏类,只是以防万一。
import UIKit
protocol ToolbarPickerViewDelegate: class {
func didTapDone()
func didTapCancel()
}
class ToolbarPickerView: UIPickerView {
public private(set) var toolbar: UIToolbar?
public weak var toolbarDelegate: ToolbarPickerViewDelegate?
override init(frame: CGRect) {
super.init(frame: frame)
self.commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.commonInit()
}
private func commonInit() {
let toolBar = UIToolbar()
toolBar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(self.doneTapped))
let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(self.cancelTapped))
toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
toolBar.backgroundColor = UIColor(red: 0/255.0, green: 142.0/255.0, blue: 44.0/255.0, alpha: 0.5)
toolBar.tintColor = UIColor(red: 0/255.0, green: 142.0/255.0, blue: 44.0/255.0, alpha: 0.5)
UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor : UIColor(red: 0/255.0, green: 142.0/255.0, blue: 44.0/255.0, alpha: 1.0),
NSAttributedString.Key.font: UIFont(name: "Clinton", size: 14)], for: UIControl.State.normal)
self.toolbar = toolBar
}
@objc func doneTapped() {
self.toolbarDelegate?.didTapDone()
}
@objc func cancelTapped() {
self.toolbarDelegate?.didTapCancel()
}
}
extension String {
// formatting text for currency textField
func currencyFormatting() -> String {
if let value = Double(self) {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.maximumFractionDigits = 0
if let str = formatter.string(for: value) {
return str
}
}
return ""
}
}
解决方案
推荐阅读
- c# - “ODP.NET,托管驱动程序”因 System.Data.Common.DbProviderFactories.GetFactory 而失败。但是“原始”有效
- ruby-on-rails - 设置 config.cache_store 有副作用吗?
- python - 检查输入时出错:预期 flatten_input 有 4 个维度,但得到了形状为 (404, 13) 的数组
- docker - 使用 docker-machine 将代理变量传递给机器
- memory-management - 不实现 Copy 的结构在哪里分配,如何从函数中返回?
- python - 创建新帖子后如何将用户重定向到新创建的帖子
- python - 在情节图例中显示固定数量的字符,后跟省略号?
- java - 在Java中将状态和支出历史存储为列表的最佳方法是什么
- perl - perl中的if条件是否需要大括号?
- java - Java 将 String 转换为 Object,然后再转换为 JSON