TableCell 转为 mapkit

Posted

技术标签:

【中文标题】TableCell 转为 mapkit【英文标题】:TableCell segue to mapkit 【发布时间】:2018-09-05 23:18:12 【问题描述】:

我正在尝试使用 segue 将注释传递给 mapkit,但是当我测试它时总是出现致命错误:Unexpectedly found nil while unwrapping an Optional value annotation is not a nil obj but mapView is

tableView 控制器中的 segue 代码

if segue.identifier == "FocusOn"
        let path = tableView.indexPathForSelectedRow
        let controller = segue.destination as! MapViewController
        let animal = animalList[(path?.row)!]
        let annotationFocus = FencedAnnotation(newTitle: animal.name!, newSubtitle: animal.animaldescription!, lat: animal.latitude, long: animal.longtitude, newType: animal.type!, newPhoto: animal.photo!)
        controller.addAnnotation(annotation: annotationFocus)
    


地图视图控制器中的功能

 func addAnnotation(annotation: FencedAnnotation) 
    self.mapView.addAnnotation(annotation)
    self.mapView.delegate = self

【问题讨论】:

segue是从table cell到mapviewcontroller 【参考方案1】:

我认为这是因为在 segue 完成之前没有调用 viewDidLoad

为此,请不要在您的tableViewController 中调用addAnnotation,而是将注释直接发送到您的mapViewController 并在viewDidAppearviewDidLoad 中调用addAnnotation

在你的mapViewController你需要

var annotation: FencedAnnotation!

在您的tableViewController 中将注释发送到mapViewController 喜欢

let annotationFocus = FencedAnnotation(newTitle: animal.name!, newSubtitle: animal.animaldescription!, lat: animal.latitude, long: animal.longtitude, newType: animal.type!, newPhoto: animal.photo!)
controller.annotation = annotationFocus

并在viewDidAppear 中致电addAnnotation 喜欢

override func viewDidAppear(_ animated: Bool)  
   addAnnotation(annotation)

【讨论】:

【参考方案2】:

根据您的解释,我无法了解全部情况,但我会尽力回答您。我建议在 MapViewController 中设置一个名为 annotation 的变量。然后在您的覆盖 func prepare() 代码中,您应该将该变量设置为 annotationFocus。这听起来可能有点令人困惑,但请尝试将这段代码放入您的 tableViewController。

    override func prepare(for segue: UIStoryboardSegue, sender: Any?)  
        if segue.identifier == "FocusOn"
            if let controller = segue.destination as? MapViewController 
                let path = tableView.indexPathForSelectedRow
                let animal = animalList[(path?.row)!]
                let annotationFocus = FencedAnnotation(newTitle: animal.name!, newSubtitle: animal.animaldescription!, lat: animal.latitude, long: animal.longtitude, newType: animal.type!, newPhoto: animal.photo!)
                controller.annotation = annotationFocus
            
        
    

然后,我会把它放到你的 mapViewController 中

    var annotation = FencedAnnotation()

    func addAnnotation() 
        self.mapView.addAnnotation(annotation)
        self.mapView.delegate = self
    

    override func viewWillAppear(animated: Bool) 
        super.viewWillAppear(animated)
        addAnnotation() 
    

当您执行 segue 时,mapViewController 中的注释会设置为 annotationFocus。这就是执行 addAnnotation() 时不需要参数的原因。我希望这行得通。

【讨论】:

我试过了,但是当我点击单元格时,应用程序崩溃并显示错误:thread1 :signal SIGABRT 也许改变 override func viewDidLoad() 来覆盖 func viewWillAppear()

以上是关于TableCell 转为 mapkit的主要内容,如果未能解决你的问题,请参考以下文章

C# DataSet转为word 急用! 我把xml文件转为DataSet了,现在需要把DataSet转为Word导出。

将RM RMVB FLV AVI 等转为ASF

求大神,QImage要转为QPixmap 怎样转

uart数据传输-float类型转为char类型和char类型转为float类型

北京时间转为时间搓 标准时间转为UTC

.htaccess转为web.config的操作技巧 apache伪静态转为iis伪静态