如何使用UITableView for TextField输入视图[Swift]

时间:2018-04-15 12:07:56

标签: ios swift uitableview firebase uitextfield

我目前有一个使用UIPickerViews的应用程序,允许用户为文本字段选择他们想要的答案(以避免拼写错误等)。

Screenshot of form with UIPickerView

但是,我发现UIPickerView并不是我想要使用的,因为我在测试时没有得到很好的反馈。

我已经对如何使用UITableView进行文本字段输入进行了一些研究,因此当用户单击Textfield时,用户将使用UIPickerView提供的相同选项切换到UITableView。一旦他们点击具有他们正在寻找的选项的单元格,它将返回到在文本字段内选择结果的表单。我认为这将是一个更好的用户体验,因为我还可以实现搜索,以帮助用户缩小他们需要更快的选项。

我一直试图让它工作一段时间,但我对编码很陌生并且还没能破解它。我想就如何处理此问题提出建议?我正在使用Swift和Storyboard来创建我的应用程序。

我是否需要使用UITableView创建一个单独的ViewController来加载选项,然后在单击单元格后将值移回到表单中?

谢谢,感谢您给予的任何帮助。

3 个答案:

答案 0 :(得分:1)

一种方法是在单独的视图控制器中使用表视图。我们称之为 choiceVC 并传递文本字段被点击的数据。 然后将数据发送回表单以显示用户选择的内容。

请按照以下步骤

通过实现UITextField的委托功能

检测用户点击文本字段并转到 choiceVC
func textFieldShouldReturn(_ textField: UITextField) -> Bool {

  textField.resignFirstResponder()
  //push your choiceVC and pass data
  var textFeildTapped = ""
  //note: chooseGameTextField should be text field's outlet
  if textField == chooseGameTextField{
    textFeildTapped = "games"
  }else if textField == chooseActiviyTextField {
    textFeildTapped = "activiy"
  } 

//first set identifier of your view controller by going to identity inspector and setting the value StoryBoard ID
if let controller = storyboard?.instantiateViewController(withIdentifier: "choiceVC") as? ProductDetailVc{
  //pass which text field was tapped
  controller.choicesToShow = textFeildTapped
  navigationController?.pushViewController(controller, animated: true)
}
return true

}

注意:choiceVC应该有一个变量" choicesToShow"字符串类型

在viewdidload of choiceVC中检查变量

if choicesToShow == "games" {
 //populate your table view with games. 
}else {
 //check for other cases and proceed accordingly
 //activiy, console etc
}

实现UITableView的didSelect委托方法

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
 //Pass data back to your form using **delegate pattern**. see link in notes below
}

备注:

答案 1 :(得分:1)

我希望此代码适合您。它让我感动不已。

第一个用于textfiled表单的视图控制器,您要打开tableview.for,使用textfield Delegate。

第一视图控制器

 func doSomething(text: UITextField, with data: String) {
            text.text = data
        }

    func textFieldDidBeginEditing(_ textField: UITextField) {
        let objGametableVC = self.storyboard?.instantiateViewController(withIdentifier: "GametableVC") as! GametableVC;
        objGametableVC.delegate = self
        objGametableVC.selectedTextField = textField
        if textField == txtActivity{
            objGametableVC.tblData.removeAll()
            objGametableVC.tblData = ["act1","act2"]
        }
        else if textField == txtGameName{
            objGametableVC.tblData.removeAll()
            objGametableVC.tblData = ["gam1","game2"]
        }
        textField.resignFirstResponder()
        self.navigationController?.pushViewController(objGametableVC, animated: true);
    }

第二个视图控制器用于tableview显示并将数据从第二个控制器传递到第一个控制器

第二个视图控制器

var delegate:Delegate?

var tblData:[String] = String

var selectedTextField:UITextField? = nil

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tblData.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let tblcell = tableView.dequeueReusableCell(withIdentifier: "gamelblCell", for: indexPath) as! gamelblCell
        tblcell.lblName.text = tblData[indexPath.row]
        return tblcell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let tblcell = tableView.cellForRow(at: indexPath) as! gamelblCell
        let data = tblcell.lblName.text
        delegate?.doSomething(text: selectedTextField!, with: data!)
        self.navigationController?.popViewController(animated: true)
    }

答案 2 :(得分:1)

如果您正在寻找选择器视图的替代方案来选择选项,您可以使用下拉类似控件例如。

  1. DropDown
  2. RSSelectionMenu
  3. 我希望这些图书馆可以解决您的问题,祝您好运