微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

菜鸟有问题。我正在尝试使用一个警报控制器,它将接受两个输入:一个来自文本字段,它将是手动输入的文本,另一个是来自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而使名称令人困惑),但是当您创建触发选择器视图,您没有将文本字段连接到类的相应属性。相反,您创建了一个局部变量storeTextField并将其设置为文本字段。

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

storeTextField = textField!

具有:

self.textLabel = textField!

大概应该看到您要完成的目标。

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

一个提示:您(以及SO上的其他人)将发现,如果您使用与它们所表示的类型一致的有意义的变量名,则调试代码会容易得多。您的代码示例中也有很多冗余/不必要的代码,例如当您创建一个从未使用过的UIPickerView实例pickerFrame,初始化storeTextField和{{1 }},然后立即用新值替换这些变量,或者当您设置itemTextField pickerViewdataSource或多次设置delegate时。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。