2017-06-29 9 views
0

したがって、View ControllerとUITableViewControllerで構成されるナビゲーションコントローラがあります。ビューコントローラには、マップビューとテキストフィールドが含まれ、tableviewcontrollerがその場所を検索します。 enter image description hereアプリケーションがクラッシュして、ビューコントローラとtableviewcontrollerの間でデータを受け渡ししようとしています

テーブルビューコントローラで場所を選択すると、そのアドレスをテキストフィールドに保存したいと考えています。私は私がテキストフィールドにそのアドレスを割り当てようとするたびしかし enter image description here

を印刷したいアドレスを取得することができ、使用してアプリケーションがクラッシュ:誰もがなぜ知っている「致命的なエラーが予期せず任意の値をアンラップしながら、nilを見つけます」 ?あなたのdidSelectRow方法でこれcell = tableView.dequeueReusableCell(withIdentifier: "cell")!を行うべきではありません

import UIKit 
import MapKit 

class LocationSearchTable: UITableViewController { 


    weak var handleMapSearchDelegate: HandleMapSearch? 
    var matchingItems: [MKMapItem] = [] 
    var mapView: MKMapView? 


    func parseAddress(_ selectedItem:MKPlacemark) -> String { 

     // put a space between "4" and "Melrose Place" 
     let firstSpace = (selectedItem.subThoroughfare != nil && 
          selectedItem.thoroughfare != nil) ? " " : "" 

     // put a comma between street and city/state 
     let comma = (selectedItem.subThoroughfare != nil || selectedItem.thoroughfare != nil) && 
        (selectedItem.subAdministrativeArea != nil || selectedItem.administrativeArea != nil) ? ", " : "" 

     // put a space between "Washington" and "DC" 
     let secondSpace = (selectedItem.subAdministrativeArea != nil && 
          selectedItem.administrativeArea != nil) ? " " : "" 

     let addressLine = String(
      format:"%@%@%@%@%@%@%@", 
      // street number 
      selectedItem.subThoroughfare ?? "", 
      firstSpace, 
      // street name 
      selectedItem.thoroughfare ?? "", 
      comma, 
      // city 
      selectedItem.locality ?? "", 
      secondSpace, 
      // state 
      selectedItem.administrativeArea ?? "" 


     ) 

     return addressLine 
    } 



} 

extension LocationSearchTable : UISearchResultsUpdating { 

    func updateSearchResults(for searchController: UISearchController) { 
     guard let mapView = mapView, 
      let searchBarText = searchController.searchBar.text else { return } 

     let request = MKLocalSearchRequest() 
     request.naturalLanguageQuery = searchBarText 
     request.region = mapView.region 
     let search = MKLocalSearch(request: request) 

     search.start { response, _ in 
      guard let response = response else { 
       return 
      } 
      self.matchingItems = response.mapItems 
      self.tableView.reloadData() 


     } 

    } 

} 

extension LocationSearchTable { 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return matchingItems.count 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! 
     let selectedItem = matchingItems[indexPath.row].placemark 
     cell.textLabel?.text = selectedItem.name 
     cell.detailTextLabel?.text = parseAddress(selectedItem) 

     // let right = (cell.detailTextLabel?.text)! 

     // print(right) 

     //print(selectedItem.name) 
     // print(parseAddress(selectedItem)) 

     return cell 
    } 

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     let selectedItem = matchingItems[indexPath.row].placemark 
     handleMapSearchDelegate?.dropPinZoomIn(selectedItem) 
     dismiss(animated: true, completion: nil) 

     let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! 


     cell.detailTextLabel?.text = parseAddress(selectedItem) 






     DispatchQueue.main.async { 
     let right = cell.detailTextLabel?.text 
     print (right!) 
     let vc = ViewController() 
     vc.testTxt.text = right! 

     } 


} 
} 
+0

を設定することを使用する必要がありますときあなたはおそらく何をしたいのですか? – user3407319

+0

vc.testTxt.text = right! – codeislife

+0

すでに 'ViewController'をインスタンス化していますが、既にインスタンス化されている既存のViewControllerを参照していません。 – paulvs

答えて

0

:これは私のテーブルビューコントローラのコードです。あなたが選択されている項目を参照したい場合は、前のビューコントローラにこのデータを渡すには、この

verride func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let selectedItem = matchingItems[indexPath.row].placemark 
} 

のような指標としてindexPath.rowによって配列からそれを取得する必要があり、あなたはアンワインドセグエlike this postを必要としています。

+0

選択したアイテムはゼロ値を返します。これを試しました。私はparseAddress(selectedItem)が必要です – codeislife

0

didSelectRowの内線番号で、コントローラを閉じてから、セルをデキューしようとしています。コントローラはもはや存在しないので、私はtableViewはゼロで、dequeueingはクラッシュを引き起こすと思います。 pushingTableViewControllerあなたが現在controllerの参照を渡すと、そのエラーが表示されますのんラインtextfieldプロパティ

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     let selectedItem = matchingItems[indexPath.row].placemark 
     handleMapSearchDelegate?.dropPinZoomIn(selectedItem) 
     dismiss(animated: true, completion: nil) 

     let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! 

     cell.detailTextLabel?.text = parseAddress(selectedItem) 
}