Swift MapKit 自动完成

Posted

技术标签:

【中文标题】Swift MapKit 自动完成【英文标题】:Swift MapKit Autocomplete 【发布时间】:2016-12-14 06:28:53 【问题描述】:

我正在尝试在我的视图控制器中设置地址自动完成功能,这样用户就不必输入整个地址,而是从搜索文本字段下方选择它。这是我的控制器的样子:

import Foundation
import UIKit
import MapKit


extension AddNewAddressViewController: MKLocalSearchCompleterDelegate 

    func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) 
        searchResults = completer.results
        searchResultsTableView.reloadData()
    

    func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) 
        // handle error
    


class AddNewAddressViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

    var searchCompleter = MKLocalSearchCompleter()
    var searchResults = [MKLocalSearchCompletion]()


    override func viewDidLoad() 

        searchCompleter.delegate = self

        searchCompleter.queryFragment = addressSearch.text!

        searchResultsTableView.dataSource = self

        super.viewDidLoad()
    



    @IBOutlet weak var addressSearch: UITextField!
    @IBOutlet weak var searchResultsTableView: UITableView!


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        let searchResultsCount = searchResults.count
        return searchResultsCount
    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let searchResult = searchResults[indexPath.row]
        let cell = UITableViewCell(style: .subtitle, reuseIdentifier: nil)
        cell.textLabel?.text = searchResult.title
        cell.detailTextLabel?.text = searchResult.subtitle
        return cell
    

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    


    @IBAction func defaultAddressButton(_ sender: Any) 
    

    @IBAction func addAddressButton(_ sender: Any) 
    


我收到一条错误消息:

类型 AddNewAddressViewController 不符合协议 'UITableViewDataSource'

我错过了什么?

提前致谢。

【问题讨论】:

【参考方案1】:

您省略了 cellForRowAtIndexPath 声明的第一个参数的下划线,这在 swift 3.0 下是必需的:

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
[etc.]

因此,您没有与预期签名匹配的所需函数。

【讨论】:

以上是关于Swift MapKit 自动完成的主要内容,如果未能解决你的问题,请参考以下文章

Swift - Xcode 8.3 自动完成未显示

iOS Xcode Swift 自动完成功能坏了?

Xcode 6.1 if/else/for/switch 语句不自动完成(仅限 Swift)

如何在 Swift 中创建自动完成文本字段

自动完成功能不适用于新的 SWIFT 文件/类

带有 Swift 超慢输入和自动完成功能的 Xcode 6