在 AlertController 中从 UIPickerView 填充文本字段时出现问题
Problem populating textfield from UIPickerView in an AlertController
新手有问题。我正在尝试使用一个警报控制器,它将接受两个输入:一个来自文本字段,将手动输入文本,另一个是来自 UIPicker 的选择。文本部分工作正常;我遇到的问题是选择器。
PickerView显示如我所愿;我遇到的问题是注册选择。作为菜鸟,我完全预料到我正在做的事情非常愚蠢(这就是为什么您会看到所有打印语句的原因);然而,经过多次尝试和搜索,我无法弄清楚我错过的那个愚蠢的错误是什么。我试过借鉴其他解决方案,这就是代码变得有点乱的原因,也是我现在转向这里寻求帮助的原因。
感谢您提供的任何帮助
import UIKit
import PMAlertController
class TableViewController: UITableViewController {
var dummyArray = ["A", "B", "C", "D", "E"]
var dummyStores = ["1", "2", "3", "4"]
var inputString: String = ""
var pickerView = UIPickerView()
var selectedStore: String?
var storeTextField: String?
var textLabel = UITextField()
override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dummyArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "itemCell", for: indexPath)
cell.textLabel?.text = dummyArray[indexPath.row]
cell.textLabel?.textAlignment = .center
return cell
}
@IBAction func addButtonPressed(_ sender: UIBarButtonItem) {
print ("Add Button Pressed")
var itemTextField = UITextField()
var storeTextField = UITextField()
let screenSize = UIScreen.main.bounds
let alertVC = PMAlertController(title: "A Title", description: "My Description", image: UIImage(named: "img.png"), style: .alert)
let pickerFrame = UIPickerView(frame: CGRect(x:5, y: 20, width: screenSize.width - 20, height: 140))
pickerFrame.tag = 555
pickerFrame.delegate = self
pickerView.delegate = self
pickerView.dataSource = self
alertVC.addTextField { (textField2) in
textField2?.placeholder = "enter item name here"
itemTextField = textField2!
}
alertVC.addTextField { (textField) in
textField?.placeholder = "select store here"
textField?.inputView = pickerView
pickerView.delegate = self
pickerView.dataSource = self
let toolbar = UIToolbar()
toolbar.barStyle = UIBarStyle.default
toolbar.isTranslucent = true
textField?.inputAccessoryView = toolbar
textField?.inputView = pickerView
storeTextField = textField!
}
alertVC.addAction(PMAlertAction(title: "Cancel", style: .cancel, action: { () -> Void in
print("Capture action Cancel")
}))
alertVC.addAction(PMAlertAction(title: "OK", style: .default, action: { () in
print("Capture action OK")
print(itemTextField.text)
print(storeTextField.text)
self.dummyArray.append(itemTextField.text!)
self.tableView.reloadData()
}))
self.present(alertVC, animated: true, completion: nil)
}
}
extension TableViewController: UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return dummyStores.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return dummyStores[row]
}
}
extension TableViewController: UIPickerViewDelegate {
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
selectedStore = dummyStores[row]
textLabel.text = selectedStore
}
}
似乎您创建了一个文本字段 textLabel
(顺便说一下,由于 UILabel
而使名称混淆),您在选择器视图委托选择方法中使用了它,但是当您创建文本字段时触发选择器视图,您没有将文本字段连接到 class' 对应的 属性。相反,您创建了一个局部变量 storeTextField
并将其设置为文本字段。
这不会执行任何操作,因为一旦上下文清除,您就会丢失对该文本字段的引用。基本上你可以替换:
storeTextField = textField!
与:
self.textLabel = textField!
而且您大概应该明白您的目标是什么。
您还有一个名为 storeTextField
的 属性,但由于某种原因那是 String?
。
提示:如果您使用与其表示的类型一致的有意义的变量名称,您(和 SO 上的其他人)会发现调试代码会容易得多。您的代码示例中还有很多冗余/不必要的代码,例如当您创建一个名为 pickerFrame
的 UIPickerView
实例时,您从未使用过,当您初始化 storeTextField
和 itemTextField
但随后立即用新值替换这些变量,或者当您设置 pickerView
dataSource
和 delegate
或多次设置 inputView
时。
新手有问题。我正在尝试使用一个警报控制器,它将接受两个输入:一个来自文本字段,将手动输入文本,另一个是来自 UIPicker 的选择。文本部分工作正常;我遇到的问题是选择器。
PickerView显示如我所愿;我遇到的问题是注册选择。作为菜鸟,我完全预料到我正在做的事情非常愚蠢(这就是为什么您会看到所有打印语句的原因);然而,经过多次尝试和搜索,我无法弄清楚我错过的那个愚蠢的错误是什么。我试过借鉴其他解决方案,这就是代码变得有点乱的原因,也是我现在转向这里寻求帮助的原因。
感谢您提供的任何帮助
import UIKit
import PMAlertController
class TableViewController: UITableViewController {
var dummyArray = ["A", "B", "C", "D", "E"]
var dummyStores = ["1", "2", "3", "4"]
var inputString: String = ""
var pickerView = UIPickerView()
var selectedStore: String?
var storeTextField: String?
var textLabel = UITextField()
override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dummyArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "itemCell", for: indexPath)
cell.textLabel?.text = dummyArray[indexPath.row]
cell.textLabel?.textAlignment = .center
return cell
}
@IBAction func addButtonPressed(_ sender: UIBarButtonItem) {
print ("Add Button Pressed")
var itemTextField = UITextField()
var storeTextField = UITextField()
let screenSize = UIScreen.main.bounds
let alertVC = PMAlertController(title: "A Title", description: "My Description", image: UIImage(named: "img.png"), style: .alert)
let pickerFrame = UIPickerView(frame: CGRect(x:5, y: 20, width: screenSize.width - 20, height: 140))
pickerFrame.tag = 555
pickerFrame.delegate = self
pickerView.delegate = self
pickerView.dataSource = self
alertVC.addTextField { (textField2) in
textField2?.placeholder = "enter item name here"
itemTextField = textField2!
}
alertVC.addTextField { (textField) in
textField?.placeholder = "select store here"
textField?.inputView = pickerView
pickerView.delegate = self
pickerView.dataSource = self
let toolbar = UIToolbar()
toolbar.barStyle = UIBarStyle.default
toolbar.isTranslucent = true
textField?.inputAccessoryView = toolbar
textField?.inputView = pickerView
storeTextField = textField!
}
alertVC.addAction(PMAlertAction(title: "Cancel", style: .cancel, action: { () -> Void in
print("Capture action Cancel")
}))
alertVC.addAction(PMAlertAction(title: "OK", style: .default, action: { () in
print("Capture action OK")
print(itemTextField.text)
print(storeTextField.text)
self.dummyArray.append(itemTextField.text!)
self.tableView.reloadData()
}))
self.present(alertVC, animated: true, completion: nil)
}
}
extension TableViewController: UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return dummyStores.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return dummyStores[row]
}
}
extension TableViewController: UIPickerViewDelegate {
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
selectedStore = dummyStores[row]
textLabel.text = selectedStore
}
}
似乎您创建了一个文本字段 textLabel
(顺便说一下,由于 UILabel
而使名称混淆),您在选择器视图委托选择方法中使用了它,但是当您创建文本字段时触发选择器视图,您没有将文本字段连接到 class' 对应的 属性。相反,您创建了一个局部变量 storeTextField
并将其设置为文本字段。
这不会执行任何操作,因为一旦上下文清除,您就会丢失对该文本字段的引用。基本上你可以替换:
storeTextField = textField!
与:
self.textLabel = textField!
而且您大概应该明白您的目标是什么。
您还有一个名为 storeTextField
的 属性,但由于某种原因那是 String?
。
提示:如果您使用与其表示的类型一致的有意义的变量名称,您(和 SO 上的其他人)会发现调试代码会容易得多。您的代码示例中还有很多冗余/不必要的代码,例如当您创建一个名为 pickerFrame
的 UIPickerView
实例时,您从未使用过,当您初始化 storeTextField
和 itemTextField
但随后立即用新值替换这些变量,或者当您设置 pickerView
dataSource
和 delegate
或多次设置 inputView
时。