代码之家  ›  专栏  ›  技术社区  ›  Daniel Jones

具有不同数组的每个文本字段的UIPickerView(Swift/Firebase)

  •  4
  • Daniel Jones  · 技术社区  · 8 年前

    我试图创建一个表单,其中每个文本字段都有一个UIPickerView,用户可以使用它来选择所需的选项。我需要为每个文本字段使用不同的信息数组,但我似乎无法让它工作,而且我已经在这上面停留了很长一段时间了。

    我有一个可能有效的方法,但我无法从Firebase的文本字段中检索数据,因为每个字段都有相同的名称。

    这是我迄今为止的代码,这是我尝试过的最新方法,但不起作用:

    import UIKit
    import Firebase
    import FirebaseDatabase
    
    class CreatePostViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate {
    
    @IBOutlet weak var gameTextField: UITextField!
    @IBOutlet weak var activityTextField: UITextField!
    @IBOutlet weak var consoleTextField: UITextField!
    @IBOutlet weak var skillTextField: UITextField!
    @IBOutlet weak var communicationTextField: UITextField!
    @IBOutlet weak var lfglfmTextField: UITextField!
    @IBOutlet weak var rulesTextView: UITextView!
    @IBOutlet weak var descriptionTextView: UITextView!
    
    var games = ["Assassin's Creed Origins", "Battlefield 1", "Call of Duty: Advanced Warfare", "Call of Duty: Black Ops III", "Call of Duty: Ghosts", "Call of Duty: Infinite Warfare", "Call of Duty: Modern Warfare Remastered", "Call of Duty: WWII", "Destiny", "Destiny 2", "Fifa 16", "Fifa 17", "Fifa 18", "Rocket League"]
    var console = ["Xbox One", "Xbox 360", "Playstation 4", "Playstation 3"]
    var skill = ["Achiever", "Explorer", "Killer", "Socializer"]
    var communication = ["Mic", "No Mic"]
    var lfglfm = ["LFG", "LFM"]
    
    var itemSelected = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    
        //remove margin / padding from textview
        self.rulesTextView.textContainerInset = .zero
        self.rulesTextView.contentInset = UIEdgeInsetsMake(0, -5, 0, 0)
    //        self.descriptionTextView.textContainerInset = .zero
    //        self.descriptionTextView.contentInset = UIEdgeInsetsMake(0, -5, 0, 0)
    
        //allow tap on screen to remove text field input from screen
        self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
    
        //UIPICKER
        let pickerView = UIPickerView()
        pickerView.delegate = self
        pickerView.dataSource = self
    
        gameTextField.inputView = pickerView
        consoleTextField.inputView = pickerView
        skillTextField.inputView = pickerView
        communicationTextField.inputView = pickerView
        lfglfmTextField.inputView = pickerView
    
        updatePicker()
    
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    //update pickerView
    func updatePicker(){
        let pickerView = UIPickerView()
        pickerView.reloadAllComponents()
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if gameTextField.isFirstResponder{
            return games.count
        }else if consoleTextField.isFirstResponder{
            return console.count
        }else if skillTextField.isFirstResponder{
            return skill.count
        }else if communicationTextField.isFirstResponder{
            return communication.count
        }else if lfglfmTextField.isFirstResponder{
            return lfglfm.count
        }
    }
    
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
        if gameTextField.isFirstResponder{
            return games[row]
        }else if consoleTextField.isFirstResponder{
            return console[row]
        }else if skillTextField.isFirstResponder{
            return skill[row]
        }else if communicationTextField.isFirstResponder{
            return communication[row]
        }else if lfglfmTextField.isFirstResponder{
            return lfglfm[row]
        }
    }
    
    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if gameTextField.isFirstResponder{
            let itemselected = games[row]
            gameTextField.text = itemselected
        }else if consoleTextField.isFirstResponder{
            let itemselected = console[row]
            consoleTextField.text = itemselected
        }else if skillTextField.isFirstResponder{
            let itemselected = skill[row]
            skillTextField.text = itemselected
        }else if communicationTextField.isFirstResponder{
            let itemselected = communication[row]
            communicationTextField.text = itemselected
        }else if lfglfmTextField.isFirstResponder{
            let itemselected = lfglfm[row]
            lfglfmTextField.text = itemselected
        }
    }
    
    
    @IBAction func createPostTapped(_ sender: UIButton) {
        if let uid = Auth.auth().currentUser?.uid {
            Database.database().reference().child("usernames").child(uid).observeSingleEvent(of: .value, with: {
                (snapshot) in
                if let userDictionary = snapshot.value as? [String: AnyObject] {
                    for user in userDictionary {
                        if let username = user.value as? String {
                            if let game = self.gameTextField.text {
                                if let activity = self.activityTextField.text {
                                    if let console = self.consoleTextField.text {
                                        if let skill = self.skillTextField.text {
                                            if let communication = self.communicationTextField.text {
                                                if let lfglfm = self.lfglfmTextField.text {
                                                    if let description = self.descriptionTextView.text {
    
                                                        let postObject: Dictionary<String, Any> = [
                                                            "uid" : uid,
                                                            "username" : username,
                                                            "game" : game,
                                                            "activity" : activity,
                                                            "console" : console,
                                                            "skill" : skill,
                                                            "communication" : communication,
                                                            "lfglfm" : lfglfm,
                                                            "description" : description
                                                            ]
    
                                                        Database.database().reference().child("posts").childByAutoId().setValue(postObject)
    
                                                        let alert = UIAlertController(title: "Success!", message: "Your post was added successfully.", preferredStyle: .alert)
                                                        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in
                                                            //code will run when ok button is pressed
                                                            let vc = self.storyboard?.instantiateViewController(withIdentifier: "LoggedInVC")
                                                            self.present(vc!, animated: true, completion: nil)
                                                        }))
                                                        self.present(alert, animated: true, completion: nil)
    
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            })
        }
    }
    
    
    
    /*
    // MARK: - Navigation
    
    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */
    
    }
    

    如果有人知道一个成功的方法,我可以实施,请随时贡献,将不胜感激。

    非常感谢。

    2 回复  |  直到 8 年前
        1
  •  8
  •   alujan    8 年前

    您的代码几乎正确。我只想用UIPickerView存储一个class属性,这样您就可以在textField编辑状态更改时重新加载组件。为此,还必须设置textField委托。

    下面是一个我刚刚评论过的调整工作示例:

    import UIKit
    
    class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate {
    
    
        @IBOutlet weak var gameTextField: UITextField!
        @IBOutlet weak var activityTextField: UITextField!
        @IBOutlet weak var consoleTextField: UITextField!
        @IBOutlet weak var skillTextField: UITextField!
        @IBOutlet weak var communicationTextField: UITextField!
        @IBOutlet weak var lfglfmTextField: UITextField!
    
        var games = ["Assassin's Creed Origins", "Battlefield 1", "Call of Duty: Advanced Warfare", "Call of Duty: Black Ops III", "Call of Duty: Ghosts", "Call of Duty: Infinite Warfare", "Call of Duty: Modern Warfare Remastered", "Call of Duty: WWII", "Destiny", "Destiny 2", "Fifa 16", "Fifa 17", "Fifa 18", "Rocket League"]
        var console = ["Xbox One", "Xbox 360", "Playstation 4", "Playstation 3"]
        var skill = ["Achiever", "Explorer", "Killer", "Socializer"]
        var communication = ["Mic", "No Mic"]
        var lfglfm = ["LFG", "LFM"]
    
        var itemSelected = ""
    
        weak var pickerView: UIPickerView?
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
    
            //remove margin / padding from textview
            //        self.descriptionTextView.textContainerInset = .zero
            //        self.descriptionTextView.contentInset = UIEdgeInsetsMake(0, -5, 0, 0)
    
            //allow tap on screen to remove text field input from screen
            self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
    
            //UIPICKER
            let pickerView = UIPickerView()
            pickerView.delegate = self
            pickerView.dataSource = self
    
            gameTextField.delegate = self
            consoleTextField.delegate = self
            skillTextField.delegate = self
            communicationTextField.delegate = self
            lfglfmTextField.delegate = self
    
            gameTextField.inputView = pickerView
            consoleTextField.inputView = pickerView
            skillTextField.inputView = pickerView
            communicationTextField.inputView = pickerView
            lfglfmTextField.inputView = pickerView
    
            //It is important that goes after de inputView assignation
            self.pickerView = pickerView
    
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
        func textFieldDidBeginEditing(_ textField: UITextField) {
            self.pickerView?.reloadAllComponents()
        }
    
        func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
            if gameTextField.isFirstResponder{
                return games.count
            }else if consoleTextField.isFirstResponder{
                return console.count
            }else if skillTextField.isFirstResponder{
                return skill.count
            }else if communicationTextField.isFirstResponder{
                return communication.count
            }else if lfglfmTextField.isFirstResponder{
                return lfglfm.count
            }
            return 0
        }
    
        func numberOfComponents(in pickerView: UIPickerView) -> Int {
            return 1
        }
    
        func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
            if gameTextField.isFirstResponder{
                return games[row]
            }else if consoleTextField.isFirstResponder{
                return console[row]
            }else if skillTextField.isFirstResponder{
                return skill[row]
            }else if communicationTextField.isFirstResponder{
                return communication[row]
            }else if lfglfmTextField.isFirstResponder{
                return lfglfm[row]
            }
            return nil
        }
    
        func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
            if gameTextField.isFirstResponder{
                let itemselected = games[row]
                gameTextField.text = itemselected
            }else if consoleTextField.isFirstResponder{
                let itemselected = console[row]
                consoleTextField.text = itemselected
            }else if skillTextField.isFirstResponder{
                let itemselected = skill[row]
                skillTextField.text = itemselected
            }else if communicationTextField.isFirstResponder{
                let itemselected = communication[row]
                communicationTextField.text = itemselected
            }else if lfglfmTextField.isFirstResponder{
                let itemselected = lfglfm[row]
                lfglfmTextField.text = itemselected
            }
        }
    
    
    
        /*
         // MARK: - Navigation
    
         // In a storyboard-based application, you will often want to do a little preparation before navigation
         override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
         // Get the new view controller using segue.destinationViewController.
         // Pass the selected object to the new view controller.
         }
         */
    
    }
    

    已编辑 :

    你不需要 updatePicker 我已删除 createPostTapped 方法来实现此简单示例。

        2
  •  1
  •   Devil Decoder    8 年前

    您可以使用textField委托方法将所选值分配给特定的文本字段,该方法是textFieldDidBeginediting,在textField确实开始编辑时调用该方法

    喜欢

    取一个变量

    var textFieldSelected = UITextField()
    

    然后进来

    func textFieldDidBeginEditing(_ textField: UITextField) {
        textFieldSelected = textField
    }
    

    通过这样做,您将获得选定的文本字段

    当你从picker中选择后

    func doneSelection(){
        if textFieldSelected == yourTextField(in which you want to enter your data)
        {
            yourTextField.text = data you want to enter from picker
        }
    }