1

我正在使用 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)
}
4

2 回答 2

1

直接更改单元格可能不是一个好主意,因为每次UITableView重新加载单元格时,单元格都会被回收,并且根据您的tableView(_:cellForRowAt:)实现,您UITextField可能会被覆盖或最终出现在其他地方。

在视图控制器中拥有某种模型或状态是更好的做法,它保存不同部分中每个单元格的状态。

在您的 GooglePlacesAutocomplete 委托中更改此状态(例如地名列表)并调用reloadDatatableView从更改后的状态中获取新数据。

在您的tableView(_:cellForRowAt:)实现中,您inputTextField.text = place.name在返回之前进行设置,这样所有单元格都应该以您内部状态的正确地名结束。

于 2018-02-18T03:21:49.710 回答
0

好的!我明白你说的凯,你是对的。我将实现一些东西来保存我的字段值。但就我而言,它是 GMSAutocompleteViewController 重新加载了我的 UITableView,因为它是用 present() 调用的。我将其更改为将其添加到我的 navigationController 中,现在我的字段仍然存在。

谢谢

于 2018-02-18T17:40:08.347 回答