在委托内访问时,IBOutlet值为nil

时间:2015-11-10 11:57:58

标签: ios swift mkmapview optional iboutlet

我在故事板中有一个包含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)

让我知道我在这里做错了什么!!谢谢!

2 个答案:

答案 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)
    }

希望它可以帮助别人!!