Ios 当在委托内部访问时,IBOutlet值获取nil
我有一个UIViewController,在情节提要中包含一个MKMapView。然后我在地图上画了个出口。从这个屏幕,我转到另一个屏幕,其中在包含地图的第一个viewcontroller中调用来自代理的消息。在这个委托方法中,当我尝试获取mapview时,问题出现了,它总是给我零。因此产生“在展开可选值时意外发现零”)错误 这是我的密码: 1) MapViewController中的IBOutlet连接Ios 当在委托内部访问时,IBOutlet值获取nil,ios,swift,mkmapview,optional,iboutlet,Ios,Swift,Mkmapview,Optional,Iboutlet,我有一个UIViewController,在情节提要中包含一个MKMapView。然后我在地图上画了个出口。从这个屏幕,我转到另一个屏幕,其中在包含地图的第一个viewcontroller中调用来自代理的消息。在这个委托方法中,当我尝试获取mapview时,问题出现了,它总是给我零。因此产生“在展开可选值时意外发现零”)错误 这是我的密码: 1) MapViewController中的IBOutlet连接 @IBOutlet weak var map: MKMapView! 2) MapVie
@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.
}
let contact = searchResults[indexPath.row] as! Contacts
self.delegate = MapViewController()
self.delegate?.didSelectSearchContact(contact)
3) 这是从另一个视图控制器调用上述委托的方式:
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.
}
let contact = searchResults[indexPath.row] as! Contacts
self.delegate = MapViewController()
self.delegate?.didSelectSearchContact(contact)
让我知道我做错了什么!!谢谢 因此,基本上您对地图视图的引用较弱。 将ViewController留给新的ViewController时,ViewController将被解除分配。因此,它丢失了指向mapKit的指针,并将其保留在内存中。 我不建议您将其更改为强指针,而是保存将来需要的必要原语或结构。 即,当您操作segue时,保存selectedContact.lat、selectedContact.lng或您需要的任何内容 我认为您应该在新的ViewController中为MAPKit提供一个单独的IBOutlet,用于连接到适当的视图。
在初始化器中,只需将mapView的参数设置为聚焦于所需的数据即可最后,花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)
}
希望它能帮助别人 显示正在设置和调用的代理此代码是否在ViewController类或子ViewController类中?@GalMarom ViewController类查看我的回答编辑问题,不要在注释中添加代码。另外,在代码周围添加上下文,它在哪里,您是否检查了它的名称…实际上,我想在地图上显示选定联系人的lat和long,并缩放以显示位置。为此,我需要mapview属性来设置其区域。请让我知道,如果有任何其他方式,我可以到这个。你可以附加任何草图或更多的信息?我不太明白你的流岛是怎么说的:我有一个带有MKMapView的MapViewController,里面有一个插座。从这个屏幕,我推到另一个名为SearchViewController的视图控制器。在这个SearchViewController上,我执行了一些操作并返回到MapViewController。现在,如果我尝试访问地图视图出口,它会给我错误。