Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当在委托内部访问时,IBOutlet值获取nil_Ios_Swift_Mkmapview_Optional_Iboutlet - Fatal编程技术网

Ios 当在委托内部访问时,IBOutlet值获取nil

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

我有一个UIViewController,在情节提要中包含一个MKMapView。然后我在地图上画了个出口。从这个屏幕,我转到另一个屏幕,其中在包含地图的第一个viewcontroller中调用来自代理的消息。在这个委托方法中,当我尝试获取mapview时,问题出现了,它总是给我零。因此产生“在展开可选值时意外发现零”)错误

这是我的密码:

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.
}
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。现在,如果我尝试访问地图视图出口,它会给我错误。