2017-09-03 6 views
0

사용자 정의 MKMarkerAnnotationView에 UITableViewCell로 표시하려는 tableview가 있습니다. 이 테이블 뷰는 전용 ViewController에 표시되고 ViewController는 TabBarController에 있습니다. 두 번째 Tab은 Map을 표시합니다 (그러나 여기서는 중요하지 않습니다).커스텀 MKMarkerAnnotationView가 처음으로 UITableViewCell에 올바르게 표시되지 않습니다.

좀 라벨과 구현의 클래스 "EdgePinViewAnnotation"

와보기를 포함 나가있는 UITableViewCell을 추가 한있는 TableView 내 스토리 보드에서 MKMarkerAnnotationView 에서 상속하는 클래스 "EdgePinViewAnnotation"를 만든

UITableViewCell, 내 사용자 지정 "EdgePinViewAnnotation"초기화 해요. 불행히도 셀이 표에 표시되면 내 기본 설정 인 "EdgePinViewAnnotation"이 아니라 기본 MKMarkerAnnotationView가 표시됩니다.

내 TableView를 스크롤하면 셀이 화면을 벗어나서 새로 고쳐지면서 내 "EdgePinViewAnnotation"이 올바르게 표시됩니다.

처음으로 올바르게 표시되지 않는 이유는 무엇입니까? 여기

나는 정말하지 않습니다를 이해하는 경우에도 해결책을 발견 내 jQuery과

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! 

} 

답변

0

에서 내 사용자 정의 다음 코드

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 
    } 

} 

MKMarkerAnnotationView

구현 한 코드입니다.

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]) 
     } 
    } 
올바르게 표시