我目前有一个使用UIPickerViews的应用程序,允许用户为文本字段选择他们想要的答案(以避免拼写错误等)。
但是,我发现UIPickerView并不是我想要使用的,因为我在测试时没有得到很好的反馈。
我已经对如何使用UITableView进行文本字段输入进行了一些研究,因此当用户单击Textfield时,用户将使用UIPickerView提供的相同选项切换到UITableView。一旦他们点击具有他们正在寻找的选项的单元格,它将返回到在文本字段内选择结果的表单。我认为这将是一个更好的用户体验,因为我还可以实现搜索,以帮助用户缩小他们需要更快的选项。
我一直试图让它工作一段时间,但我对编码很陌生并且还没能破解它。我想就如何处理此问题提出建议?我正在使用Swift和Storyboard来创建我的应用程序。
我是否需要使用UITableView创建一个单独的ViewController来加载选项,然后在单击单元格后将值移回到表单中?
谢谢,感谢您给予的任何帮助。
答案 0 :(得分:1)
一种方法是在单独的视图控制器中使用表视图。我们称之为 choiceVC 并传递文本字段被点击的数据。 然后将数据发送回表单以显示用户选择的内容。
通过实现UITextField的委托功能
检测用户点击文本字段并转到 choiceVCfunc 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)
如果您正在寻找选择器视图的替代方案来选择选项,您可以使用下拉类似控件例如。
我希望这些图书馆可以解决您的问题,祝您好运