在 AlertController 中从 UIPickerView 填充文本字段时出现问题

Posted

技术标签:

【中文标题】在 AlertController 中从 UIPickerView 填充文本字段时出现问题【英文标题】:Problem populating textfield from UIPickerView in an AlertController 【发布时间】:2020-09-04 18:25:28 【问题描述】:

菜鸟有问题。我正在尝试使用一个警报控制器,它将接受两个输入:一个来自文本字段,它将是手动输入的文本,另一个是来自 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
    

【问题讨论】:

@matt :“PickerView 显示为我想要的;我遇到的问题是注册选择” 【参考方案1】:

似乎您创建了一个文本字段textLabel(顺便说一下,名称令人困惑,因为UILabel)您在选择器视图委托选择方法中使用它,但是当您创建触发选择器视图的文本字段时,您没有将文本字段连接到类的相应属性。相反,您创建了一个局部变量 storeTextField 并将其设置为文本字段。

这不会做任何事情,因为一旦上下文清除,您就会失去对该文本字段的引用。基本上你可以替换:

storeTextField = textField!

与:

self.textLabel = textField!

你大概应该看看你的目标是什么。

您还有一个名为 storeTextField 的属性,但出于某种原因,它是 String?

提示:如果您使用与它们所代表的类型一致的有意义的变量名称,您(和其他 SO 上的其他人)会发现调试代码会容易得多。您的代码示例中还有很多冗余/不必要的代码,例如当您创建一个从未使用过的名为 pickerFrameUIPickerView 实例时,当您初始化 storeTextFielditemTextField 但随后立即替换这些变量时使用新值,或者当您设置 pickerView dataSourcedelegate 或多次设置 inputView 时。

【讨论】:

感谢您的回复;是的,同意 - 我使用的命名,以及无用的、命名不佳的变量是一个问题。它们是我尝试不同的解决方案和想法来解决问题的结果,它们使我的代码变得一团糟。一旦我让这部分工作,我希望能把它清理干净,并使用更好的标签。我仍然无法让它工作。我在想,以我有限的知识,我错误地设置了 UIPicker。但是,我会尝试清除代码,并专注于您提出的建议。非常感谢。 好的 - 我必须对代码进行一些(必要的)配对,但结合您的建议,我认为它已解决。它似乎(现在!)正在工作。谢谢!!!!!!

以上是关于在 AlertController 中从 UIPickerView 填充文本字段时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

在 FCMPlugin Ionic 2 中调用时,AlertController 不起作用

在通过代码呈现的另一个 ViewController 上显示 AlertController

内存泄漏AlertController / UIImagePickerController

如何在 ionic 4 中使用 alertcontroller 返回承诺?

每次在嵌套条件swift ios中都会弹出AlertController

Swift - 如何在自定义 AlertController 中点击按钮时呈现 ViewController