第一次在UITableViewCell中无法正确显示自定义MKMarkerAnnotationView

时间:2017-09-03 20:56:18

标签: ios swift uitableview mkannotationview

我有一个tableview,我想在UITableViewCell中显示一个自定义的MKMarkerAnnotationView。此tableview显示在专用的ViewController中,ViewController位于TabBarController中。第二个选项卡显示一个地图(但这里不重要)。

我创建了一个继承自MKMarkerAnnotationView的类“EdgePinViewAnnotation” 在我的故事板中,在TableView中我添加了一个包含一些标签的UITableViewCell和一个带有“EdgePinViewAnnotation”类的视图

在UITableViewCell的实现中,我正在初始化我的自定义“EdgePinViewAnnotation”。 不幸的是,当Cell显示在表格中时,它是显示的默认MKMarkerAnnotationView,而不是我自定义的“EdgePinViewAnnotation”。

当我滚动我的TableView并且单元格离开屏幕然后刷新它时,它会正确显示我的“EdgePinViewAnnotation”。

为什么第一次显示不正确?

这里是我为自定义MKMarkerAnnotationView实现的代码

class EdgePinViewAnnotation: MKMarkerAnnotationView {

    override var annotation: MKAnnotation? {
        willSet {
            if let edgeAnnotation = newValue as? EdgePin {
                animatesWhenAdded = true
                isDraggable = true
                canShowCallout = true
                initRenderingProperties(pin: edgeAnnotation)
            }
        }
    }


    func initWith(edgePin:EdgePin) {
        animatesWhenAdded = false
        isDraggable = false
        canShowCallout = false
        initRenderingProperties(pin: edgePin)
    }

    func initRenderingProperties(pin edgePin:EdgePin) {
        glyphTintColor = UIColor.white
        glyphText = "\(edgePin.index)"
        markerTintColor = edgePin.renderingColor
    }

}

这是我的UITableView

中的代码
   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        if indexPath.section == 0 {
            if let cell = tableView.dequeueReusableCell(withIdentifier: CellId.DistanceConfigurationCellId, for: indexPath) as? DistanceConfigurationTableViewCell {
                cell.theLabel.text = findMe.edgePoints[indexPath.row].address
                let coord = findMe.edgePoints[indexPath.row].coordinate
                cell.coordinates.text = "Lat:\(coord.latitude) / Long:\(coord.longitude)"
                cell.theTextField.text = "\(findMe.edgePoints[indexPath.row].distance)"
                cell.theTextField.delegate = self
                cell.theTextField.tag = indexPath.row
                cell.theMarker.initWith(edgePin:findMe.edgePoints[indexPath.row])
                return cell
            }
        } else {
     return UITableViewCell()
    }
}



class DistanceConfigurationTableViewCell: UITableViewCell {

    @IBOutlet weak var theLabel: UILabel!
    @IBOutlet weak var coordinates: UILabel!
    @IBOutlet weak var theTextField: UITextField!

    @IBOutlet weak var theMarker: EdgePinViewAnnotation!

}

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,即使我不太了解它。

必须在

中配置MKMarkerAnnotationView
tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 

而不是

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

然后以下代码正常工作,并且MKMarkerAnnotationView在每个UITableViewCell中正确显示

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        if indexPath.section == 0 {
            if let cell = tableView.dequeueReusableCell(withIdentifier: CellId.DistanceConfigurationCellId, for: indexPath) as? DistanceConfigurationTableViewCell {
                cell.theLabel.text = findMe.edgePoints[indexPath.row].address
                let coord = findMe.edgePoints[indexPath.row].coordinate
                cell.coordinates.text = "Lat:\(coord.latitude) / Long:\(coord.longitude)"
                cell.theTextField.text = "\(findMe.edgePoints[indexPath.row].distance)"
                cell.theTextField.delegate = self
                cell.theTextField.tag = indexPath.row

                return cell
            }
        } else {
     return UITableViewCell()
    }
}

  func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        if let theCell = cell as? DistanceConfigurationTableViewCell {

            theCell.theMarker.initWith(edgePin:findMe.edgePoints[indexPath.row])
        }
    }