我有一个 UIViewController,其中包含 Storyboard 中的 MKMapView。然后我做了一个 map View 的导出。从这个屏幕我转到另一个屏幕,在包含 map 的第一个 View Controller 中回调委托(delegate)。当在这个委托(delegate)方法中,我尝试获取 map View 时,就会出现问题,它总是给我零。从而产生“在展开可选值时意外发现 nil”)错误。
这是我的代码:
1)MapViewController中的IBOutlet连接
@IBOutlet weak var map: MKMapView!
2)MapViewController中的委托(delegate)方法:
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) 这是从另一个 View Controller 调用上述委托(delegate)的方式:
let contact = searchResults[indexPath.row] as! Contacts
self.delegate = MapViewController()
self.delegate?.didSelectSearchContact(contact)
让我知道我在这里做错了什么!谢谢!
最佳答案
所以基本上你持有对mapView的弱引用。 当您将 ViewController 留给新的 viewController 时,viewController 将被释放。因此,它丢失了指向mapKit的指针并将其保留在内存中。 我不建议您将其更改为强指针,而是保存将来需要的必要原语或结构。 即,当您操作 segue 时,请保存 selectedContact.lat、selectedContact.lng 或您需要的任何内容。
我认为您应该在新的 ViewController 中为连接到适当 View 的 MAPKit 提供一个单独的 IBOutlet。 在初始化程序中,只需设置 mapView 的参数以关注所需的数据
关于ios - 在委托(delegate)内部访问时 IBOutlet 值为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33629466/