我正在使用Swift 4在iOS 11上使用表单应用程序。我想将Google的选择器(PlaceAutocomplete)返回到我的UITableView的一个单元格的UITextField中。问题在于,尽管分配了新值,但文本字段仍为空白。调试一段时间后,似乎在选择位置时丢弃了我的UITextField的内容。
这些是带有结果值分配的GooglePlaceAutocomplete回调:
extension MyUITableViewController, GMSAutocompleteViewControllerDelegate {
func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) {
print("Place name: \(place.name)")
let indexPath4 = IndexPath(row: 4, section: 0)
let cell4 = tableView.cellForRow(at: indexPath4) as! InputPlacePicker
cell4.inputTextField.text = place.name
dismiss(animated: true, completion: nil)
}
func viewController(_ viewController: GMSAutocompleteViewController, didFailAutocompleteWithError error: Error) {
print("Error: ", error.localizedDescription)
}
func wasCancelled(_ viewController: GMSAutocompleteViewController) {
dismiss(animated: true, completion: nil)
}
}
这是对GooglePlaceAutocomplete的调用
@objc func pickPlace() {
let autocompleteController = GMSAutocompleteViewController()
autocompleteController.delegate = self
present(autocompleteController, animated: true, completion: nil)
}
答案 0 :(得分:1)
直接更改单元格可能不是一个好主意,因为每次重新加载UITableView
时,单元格都会被回收,并且根据您的tableView(_:cellForRowAt:)
实现,您的UITextField
可能会被覆盖或结束在其他地方。
最好在视图控制器中使用某种模型或状态,它保存不同部分中每个单元格的状态。
在GooglePlacesAutocomplete委托中更改此状态(例如地名列表),并在reloadData
上致电tableView
以获取更改后的状态中的新数据。
在tableView(_:cellForRowAt:)
实施中,您在返回之前设置inputTextField.text = place.name
,这样所有单元格都应该从您的内部状态中找到正确的地名。
答案 1 :(得分:0)
好!我明白你所说的Kie和你是对的。我会实现一些东西来保存我的字段值。 但就我而言,GMSAutocompleteViewController重新加载了我的UITableView,因为它是用present()调用的。我改变了它,将它添加到我的navigationController,现在我的字段仍然存在。
由于