菜鸟教程小白 发表于 2022-12-11 18:08:19

ios - nils 发现在 MKLocalSearch 请求中展开可选值


                                            <p><p>使用 iPhone6,Xcode 8.1,运行 iOS 10.1.1,执行以下 Swift 代码,我间歇性地收到 <code>fatal error: unexpectedly found nil unwrapping Optional value</code> 在这个简单的代码。 </p>

<p>大约 50% 的时间它可以正常工作,这让我相信它与搜索调用需要更长的时间才能完成有关,正如我发现的类似 MapKit 问题的一些解决方案中所建议的那样。但是错误似乎发生在不包含可选值的完成处理程序中,所以我不明白我怎么能得到 nil 结果。 </p>

<p>代码片段和控制台输出如下所示。任何见解将不胜感激。</p>

<pre><code>class ViewController: UIViewController, UISearchBarDelegate, MKMapViewDelegate,UINavigationControllerDelegate {
    var searchController:UISearchController!


func searchBarSearchButtonClicked(_ searchBar: UISearchBar){
    //1
    print(&#34;Entered searchBarSearchButtonClicked&#34;)
    searchBar.resignFirstResponder()
    dismiss(animated: true, completion: nil)
    if self.mapView.annotations.count != 0{
      annotation = self.mapView.annotations // both are type MKAnnotation
      self.mapView.removeAnnotation(annotation)
    }

    //2 make 1st search request
    print(&#34;Make 1st search request&#34;)
    let localSearchRequest1 = MKLocalSearchRequest()
    localSearchRequest1.naturalLanguageQuery = searchBar.text
    print(&#34;localSearchRequest1 initialized&#34;)

    let localSearch1 = MKLocalSearch(request: localSearchRequest1)
    localSearch1.start(completionHandler: {(response, error) in

      if error != nil {
            print(&#34;Error occured in search:\(error!.localizedDescription)&#34;)
      } else{

      //3 make annotation pin
      print(&#34;make annotation pin&#34;)
      self.pointAnnotation = MKPointAnnotation()
      print(searchBar.text ?? &#34;searchBarText&#34;)
      self.pointAnnotation.title = searchBar.text
      print(response!.boundingRegion.center.latitude)
      self.pointAnnotation.coordinate = CLLocationCoordinate2D(latitude: response!.boundingRegion.center.latitude,         longitude:   response!.boundingRegion.center.longitude)
      self.coord1 = self.pointAnnotation.coordinate

      self.placeMark1 = MKPlacemark(coordinate: self.pointAnnotation.coordinate, addressDictionary: nil)


      self.pinAnnotationView = MKPinAnnotationView(annotation: self.pointAnnotation, reuseIdentifier: nil)
      self.mapView.centerCoordinate = self.pointAnnotation.coordinate
      self.mapView.addAnnotation(self.pinAnnotationView.annotation!)
      self.searchButtonClicked += 1

    }
})
</code></pre>

<blockquote>
<p>**** Console Log ****</p>
</blockquote>

<pre><code>Entered showSearchBar

Presented searchController

2016-11-24 22:07:41.409907 MapLocator 3 Match System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles

2016-11-24 22:07:41.420495 MapLocator 3 Match Reading from public effective user settings.

Entered searchBarSearchButtonClicked

Make 1st search request

localSearchRequest1 initialized

fatal error: unexpectedly found nil while unwrapping an Optional value

2016-11-24 22:07:46.072037 MapLocator 3 Match fatal error: unexpectedly found nil while unwrapping an Optional value
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>检查您的 <code>response</code> 对象不是可选值。</p>

<p>如果您想使用 <code>response!.boundingRegion.center.latitude</code>,请使用 <code>guard let response = response else</code> 确保 <code>response</code> 不是 <code>nil</code>。</p>

<h3>更新</h3>

<p>我重写了初始化<code>localSearch1</code>的代码,希望对你有帮助。</p>

<p>guard let localSearch1 = MKLocalSearch(request: localSearchRequest1) else {
       //localSearch1 在这里是 nil
      返回
    }</p>

<pre><code>localSearch1.start(completionHandler: {(response, error) in

    if error != nil {
      // Has an error, return
      print(&#34;Error occured in search:\(error.localizedDescription)&#34;)
      return
    }

    guard let response = response else {
      // response = nil, return
      print(&#34;No response data&#34;)
      return
    }

    // Make annotation pin
    self.pointAnnotation = MKPointAnnotation()

    self.pointAnnotation.title = searchBar.text ?: &#34;&#34;
    self.pointAnnotation.coordinate = CLLocationCoordinate2D(latitude: response.boundingRegion.center.latitude,
                                                            longitude: response.boundingRegion.center.longitude)
    self.coord1 = self.pointAnnotation.coordinate
    self.placeMark1 = MKPlacemark(coordinate: self.pointAnnotation.coordinate, addressDictionary: nil)

    self.pinAnnotationView = MKPinAnnotationView(annotation: self.pointAnnotation, reuseIdentifier: nil)
    self.mapView.centerCoordinate = self.pointAnnotation.coordinate
    self.mapView.addAnnotation(self.pinAnnotationView.annotation!) // I don&#39;t know whether this annotation is nil or not
    self.searchButtonClicked += 1
}
</code></pre>

<p>另外,你应该知道,在 Swift 中,<code>self</code> 可以省略。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - nils 发现在 MKLocalSearch 请求中展开可选值,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/40797629/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/40797629/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - nils 发现在 MKLocalSearch 请求中展开可选值