我在故事板中有一个包含MKMapView的UIViewController。然后我做了一个mapview的出口。在这个屏幕上,我转到另一个屏幕,在第一个包含地图的viewcontroller中调用一个委托。问题出现在这个委托方法中,我试图获取mapview,它总是给我零。因此,在展开“可选值”时,生成"意外地发现了nil“"错误。
这是我的代码:
1)MapViewController中的IBOutlet连接
@IBOutlet weak var map: MKMapView!
2)MapViewController中的委托方法:
func didSelectSearchContact(selectedContact: Contacts) -> Void{
let coordinate: CLLocationCoordinate2D = CLLocationCoordinate2DMake(selectedContact.lat, selectedContact.lng)
let span = MKCoordinateSpanMake(2.0, 2.0)
let region: MKCoordinateRegion = MKCoordinateRegion(center: coordinate, span: span)
print("self.map====== \(self.map)")
map.region = map.regionThatFits(region)//here comes the crash.
}
3)这是如何从另一个视图控制器调用上面的委托:
let contact = searchResults[indexPath.row] as! Contacts
self.delegate = MapViewController()
self.delegate?.didSelectSearchContact(contact)
让我知道我在这里做错了什么!!谢谢!
答案 0 :(得分:0)
所以基本上你持有对mapView的弱引用。 当您将ViewController保留到新的viewController时,将取消分配viewController。因此,它丢失了指向mapKit的指针并将其保留在内存中。 我不建议您将其更改为强指针,而是保存将来需要的必要原语或结构。 即当您操作segue时,保存selectedContact.lat,selectedContact.lng或您需要的任何内容。
我认为你应该在新的ViewController中有一个单独的IBOutlet到MAPKit,它连接到适当的视图。 在初始化程序中,只需将mapView的参数设置为专注于所需的数据
即可答案 1 :(得分:0)
最后,好好在40分钟内找出眼前的错误。 :P
问题是我在设置委托时试图分配控制器的新对象。此外,我正在设置委托错误的方式。
现在第3步(参见我的问题)看起来像这样:
let contact = searchResults[indexPath.row] as! Contacts
//self.delegate = MapViewController // this line was the reason of error, so I commented it out
if (self.delegate != nil){
self.delegate?.didSelectSearchContact(contact)
}
希望它可以帮助别人!!