【问题标题】:Swift MKMapItem datasource for tableview not working表视图的 Swift MKMapItem 数据源不起作用
【发布时间】:2016-09-17 21:38:37
【问题描述】:

我有一个 UITableView 使用 MKMapItemArray 作为其数据源,在我的测试中,数据源中有 10 个项目,但是当我尝试加载应用程序崩溃的数据时:

2016-09-17 22:17:58.097901 app[460:48227] * 中的断言失败 -[UITableView _configureCellForDisplay:forIndexPath:],/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3599.6/UITableView.m:8035 2016-09-17 22:17:58.099698 应用程序[460:48227] * 终止应用程序由于 未捕获的异常“NSInternalInconsistencyException”,原因: 'UITableView (; layer = ; contentOffset: {0, -64}; contentSize: {768, 440}>) 未能从其数据源获取单元格 ()'

我的代码:

extension LocationSearchTable : UISearchResultsUpdating {
    @available(iOS 8.0, *)
    public func updateSearchResults(for searchController: UISearchController) {
        guard let mapView = mapView,
            let searchBarText = searchController.searchBar.text else { return }

        print(searchBarText)

        let request = MKLocalSearchRequest()
        request.naturalLanguageQuery = searchBarText
        request.region = mapView.region
        let search = MKLocalSearch(request: request)
        search.start { response, _ in
            guard let response = response else {
                return
            }
            print(response.mapItems)
            self.matchingItems = response.mapItems
            self.tableView.reloadData()
        }
    }

    func updateSearchResultsForSearchController(searchController: UISearchController) {
        guard let mapView = mapView,
            let searchBarText = searchController.searchBar.text else { return }
        let request = MKLocalSearchRequest()
        request.naturalLanguageQuery = searchBarText
        request.region = mapView.region
        let search = MKLocalSearch(request: request)
        search.start { response, _ in
            guard let response = response else {
                return
            }
            self.matchingItems = response.mapItems
            self.tableView.reloadData()
        }
    }
}

extension LocationSearchTable {
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return matchingItems.count
    }

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
        let selectedItem = matchingItems[indexPath.row].placemark
        cell.textLabel?.text = selectedItem.name
        cell.detailTextLabel?.text = parseAddress(selectedItem: selectedItem)
        return cell
    }
}

extension LocationSearchTable {
     func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let selectedItem = matchingItems[indexPath.row].placemark
        handleMapSearchDelegate?.dropPinZoomIn(placemark: selectedItem)
        dismiss(animated: true, completion: nil)
    }
}

在我的测试示例中,updateSearchResults 函数中的 print 语句给出了输出:

[<MKMapItem: 0x174343700> {
    isCurrentLocation = 0;
    name = "H C Alexander Ltd";
    phoneNumber = "\U200e+44 1394 382585";
    placemark = "H C Alexander Ltd, 10 The Thoroughfare, Woodbridge, IP12 1AG, England @ <+52.09266610,+1.31714750> +/- 0.00m, region CLCircularRegion (identifier:'<+52.09266610,+1.31714750> radius 49.91', center:<+52.09266610,+1.31714750>, radius:49.91m)";
    timeZone = "Europe/London (BST) offset 3600 (Daylight)";
    url = "http://www.alexandersofwoodbridge.co.uk";
}, <MKMapItem: 0x174342cb0> {
    isCurrentLocation = 0;
    name = "Hudsons C M B H I";
    phoneNumber = "\U200e+44 1394 382798";
    placemark = "Hudsons C M B H I, 54 The Thoroughfare, Woodbridge, IP12 1AL, England @ <+52.09334980,+1.31937410> +/- 0.00m, region CLCircularRegion (identifier:'<+52.09334980,+1.31937410> radius 49.91', center:<+52.09334980,+1.31937410>, radius:49.91m)";
    timeZone = "Europe/London (BST) offset 3600 (Daylight)";
    url = "http://www.askhudsons.com";
}, <MKMapItem: 0x174156630> {
    isCurrentLocation = 0;
    name = "G A H";
    phoneNumber = "\U200e+44 1394 386606";
    placemark = "G A H, Melton Road, Woodbridge, IP12, England @ <+52.09991570,+1.32574770> +/- 0.00m, region CLCircularRegion (identifier:'<+52.09991570,+1.32574768> radius 124.78', center:<+52.09991570,+1.32574768>, radius:124.78m)";
    timeZone = "Europe/London (BST) offset 3600 (Daylight)";
    url = "http://www.gah.co.uk";
}, <MKMapItem: 0x17015fcc0> {
    isCurrentLocation = 0;
    name = "H Helias & Co Ltd";
    phoneNumber = "\U200e+44 1394 388400";
    placemark = "H Helias & Co Ltd, 102 The Thoroughfare, Woodbridge, IP12 1AR, England @ <+52.09515550,+1.32168410> +/- 0.00m, region CLCircularRegion (identifier:'<+52.09515550,+1.32168410> radius 49.91', center:<+52.09515550,+1.32168410>, radius:49.91m)";
    timeZone = "Europe/London (BST) offset 3600 (Daylight)";
}, <MKMapItem: 0x17015fed0> {
    isCurrentLocation = 0;
    name = "Dr Taylor & Partners";
    phoneNumber = "\U200e+44 1394 382046";
    placemark = "Dr Taylor & Partners, 7 Little Saint John's Street, Woodbridge, IP12 1EE, England @ <+52.09380320,+1.31892590> +/- 0.00m, region CLCircularRegion (identifier:'<+52.09380320,+1.31892590> radius 49.91', center:<+52.09380320,+1.31892590>, radius:49.91m)";
    timeZone = "Europe/London (BST) offset 3600 (Daylight)";
    url = "http://www.woodbridgedoctors.com";
}, <MKMapItem: 0x174343650> {
    isCurrentLocation = 0;
    name = "E H (Bob) Brewster";
    placemark = "E H (Bob) Brewster, 10 Sun Lane, Woodbridge, IP12 1EG, England @ <+52.09529930,+1.32073100> +/- 0.00m, region CLCircularRegion (identifier:'<+52.09529930,+1.32073100> radius 49.91', center:<+52.09529930,+1.32073100>, radius:49.91m)";
    timeZone = "Europe/London (BST) offset 3600 (Daylight)";
}, <MKMapItem: 0x1703400b0> {
    isCurrentLocation = 0;
    name = "William H Brown";
    phoneNumber = "\U200e+44 1394 380280";
    placemark = "William H Brown, 28D Church Street, Woodbridge, IP12 1DH, England @ <+52.09353230,+1.31466980> +/- 0.00m, region CLCircularRegion (identifier:'<+52.09353230,+1.31466980> radius 49.91', center:<+52.09353230,+1.31466980>, radius:49.91m)";
    timeZone = "Europe/London (BST) offset 3600 (Daylight)";
    url = "https://www.williamhbrown.co.uk/estate-agents/woodbridge";
}, <MKMapItem: 0x174342890> {
    isCurrentLocation = 0;
    name = "G H Reeve";
    phoneNumber = "\U200e+44 1394 384333";
    placemark = "G H Reeve, 7 Old Barrack Road, Woodbridge, IP12 4EX, England @ <+52.09248070,+1.30294050> +/- 0.00m, region CLCircularRegion (identifier:'<+52.09248070,+1.30294050> radius 49.91', center:<+52.09248070,+1.30294050>, radius:49.91m)";
    timeZone = "Europe/London (BST) offset 3600 (Daylight)";
}, <MKMapItem: 0x174343390> {
    isCurrentLocation = 0;
    name = "Hemmings J H R";
    phoneNumber = "\U200e+44 1394 610517";
    placemark = "Hemmings J H R, 5 Mill View Close, Woodbridge, IP12 4HR, England @ <+52.09490750,+1.30139670> +/- 0.00m, region CLCircularRegion (identifier:'<+52.09490750,+1.30139670> radius 49.91', center:<+52.09490750,+1.30139670>, radius:49.91m)";
    timeZone = "Europe/London (BST) offset 3600 (Daylight)";
}, <MKMapItem: 0x1743434f0> {
    isCurrentLocation = 0;
    name = "G A H (Heating Products) Ltd";
    phoneNumber = "\U200e+44 1394 386699";
    placemark = "G A H (Heating Products) Ltd, Melton Road, Woodbridge, IP12, England @ <+52.09991570,+1.32574770> +/- 0.00m, region CLCircularRegion (identifier:'<+52.09991570,+1.32574768> radius 124.78', center:<+52.09991570,+1.32574768>, radius:124.78m)";
    timeZone = "Europe/London (BST) offset 3600 (Daylight)";
}]

我在故事板中设置了表格视图和单元格:

【问题讨论】:

    标签: ios swift uitableview uikit


    【解决方案1】:

    请务必注册您的tableview,以便重复使用具有cell id 的单元格:

    tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")  
    

    例如,您可以在viewDidLoad 中添加此代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多