2016-05-11 3 views
3

テーブルビューで何かを検索するときに検索バーを追加しました。検索バーのデフォルトのキャンセルボタンを押してキーボードを閉じると、アプリがクラッシュする。理由: ' - [_ UIFullscreenPresentationController adaptivePresentationController]:

クラッシュレポート:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_UIFullscreenPresentationController adaptivePresentationController]: unrecognized selector sent to instance 0x7ff10a88cd80' 
*** First throw call stack: 
(
    0 CoreFoundation      0x000000010b18ed85 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x000000010ca8adeb objc_exception_throw + 48 
    2 CoreFoundation      0x000000010b197d3d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205 
    3 CoreFoundation      0x000000010b0ddcfa ___forwarding___ + 970 
    4 CoreFoundation      0x000000010b0dd8a8 _CF_forwarding_prep_0 + 120 
    5 UIKit        0x000000010dfda4c2 -[UISearchController _searchPresentationController] + 134 
    6 UIKit        0x000000010db8ad77 -[_UISearchControllerTransplantSearchBarAnimator animateTransition:] + 215 
    7 UIKit        0x000000010d6f148f __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 2638 
    8 UIKit        0x000000010d58ef62 _runAfterCACommitDeferredBlocks + 317 
    9 UIKit        0x000000010d5a2e4c _cleanUpAfterCAFlushAndRunDeferredBlocks + 95 
    10 UIKit        0x000000010d5af147 _afterCACommitHandler + 90 
    11 CoreFoundation      0x000000010b0b3c37 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 
    12 CoreFoundation      0x000000010b0b3ba7 __CFRunLoopDoObservers + 391 
    13 CoreFoundation      0x000000010b0a97fb __CFRunLoopRun + 1147 
    14 CoreFoundation      0x000000010b0a90f8 CFRunLoopRunSpecific + 488 
    15 GraphicsServices     0x000000010ff92ad2 GSEventRunModal + 161 
    16 UIKit        0x000000010d582f09 UIApplicationMain + 171 
    17 Screen 6       0x000000010a791e82 main + 114 
    18 libdyld.dylib      0x000000010f1c892d start + 1 
    19 ???         0x0000000000000001 0x0 + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
(lldb) 

はここに私のコードです:

import UIKit 
import CoreLocation 

class ContainerViewController: UIViewController, CLLocationManagerDelegate, UITableViewDelegate, UITableViewDataSource { 


     let searchConroller = UISearchController(searchResultsController: nil) 



    @IBOutlet var TableViewList: UITableView! 

     // array to store the value from json 
    var arrDict = [Businessdata]() 
    var filteredData = [Businessdata]() 
    var marrFilteredCountryList = [String]() 


    override func viewDidLoad() { 

     super.viewDidLoad() 
      searchConroller.searchBar.hidden = true 





    searchConroller.searchResultsUpdater = self 
     searchConroller.dimsBackgroundDuringPresentation = false 
     definesPresentationContext = true 


    } 



    func filterContentForSearch(searchText: String, scope: String = "All") 
    { 

     filteredData = arrDict.filter { Businessdata in 
      return Businessdata.BusinessName!.lowercaseString.containsString(searchText.lowercaseString) 
     } 
     TableViewList.reloadData() 
    } 

    override func viewDidAppear(animated: Bool) 
    { 
     self.LocationLabel.text = "in Toronto, ON" 
     self.TypeLabel.text = BTdata?.BTNames 
     self.BTypeId = BTdata?.BTIds 
     LoadBusinesses() 
    } 



    override func viewWillDisappear(animated: Bool) 
    { 
     super.viewWillDisappear(animated) 
     self.navigationController?.navigationBarHidden = false 
    } 


    @IBAction func searchPressed(sender: AnyObject) 
    { 
//   



     if searchConroller.searchBar.hidden 
     { 
      searchConroller.searchBar.hidden = false 
      TableViewList.tableHeaderView = searchConroller.searchBar 
      //yConstraint.constant = 44; 
     } 
     else 
     { 
      searchConroller.searchBar.hidden = true 
      //-searchBar.bounds.height 
       yConstraint.constant = 0; 

     } 

    } 


    // web services method 
    func LoadBusinesses() 
    { 
     self.arrDict.removeAll() 

     let token = NSUserDefaults.standardUserDefaults().valueForKey("access_token") as! String 

     let headers = ["x-access-token": token] 

     var StringUrl:String = "http://some url” 

     StringUrl += "?lat=\(self.NewCurrentLatitude)" 

     StringUrl += "&long=\(self.NewCurrentLongitude)" 

     let request = NSMutableURLRequest(URL: NSURL(string: StringUrl)!, 
              cachePolicy: .UseProtocolCachePolicy, 
              timeoutInterval: 10.0) 
     request.HTTPMethod = "GET" 
     request.allHTTPHeaderFields = headers 

     let session = NSURLSession.sharedSession() 
     let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in 
      if (error != nil) 
      { 
       print(error) 
      } 
      else 
      { 
       dispatch_async(dispatch_get_main_queue(),{ 

       if let json = (try? NSJSONSerialization.JSONObjectWithData(data!, options: [])) as? NSDictionary 
       { 
        let success = json["success"] as? Int 

        if (success == 1) 
        { 
         if let reposArray = json["data"] as? [NSDictionary] 
         { 
           for item in reposArray 
           { 
            let itemObj = item as? Dictionary<String,AnyObject> 

            let b_type = itemObj!["business_type"] 

            // taxis type 
            if (b_type as? String == self.BTypeId) 
            { 
             self.arrDict.append(Businessdata(json:item)) 
             self.TableViewList.reloadData() 
            } 
           } 
         } 
        } 
        else 
        { 
         let message = json["message"] as? String 
         print(message) 
        } 
       } 
       else 
       { 
        print("Json Data error") 
       } 
       }) 
      } 
     }) 
     dataTask.resume() 
    } 


    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    { 
     // 
     var numOfSection: NSInteger = 0 

     if arrDict.count > 0 
     { 
      self.TableViewList.backgroundView = nil 
      numOfSection = 1 
     } 
     else 
     { 
      let noDataLabel: UILabel = UILabel(frame: CGRectMake(0, 0, self.TableViewList.bounds.size.width, self.TableViewList.bounds.size.height)) 
      noDataLabel.text = "No Data Available" 
      noDataLabel.textColor = UIColor(red: 22.0/255.0, green: 106.0/255.0, blue: 176.0/255.0, alpha: 1.0) 
      noDataLabel.textAlignment = NSTextAlignment.Center 
      self.TableViewList.backgroundView = noDataLabel 
     } 
     return numOfSection 
    } 


    // number of rows 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     ResultCount.text = String(self.arrDict.count)+" Results" 

//  if searchConroller.active && searchConroller.searchBar.text = "" { 
//    
//   return filteredData.count 
//  } 

     if searchConroller.active && searchConroller.searchBar.text! != "" { 

      return filteredData.count 
     } 
     else 
     { 
     return self.arrDict.count 
     } 
    } 

    // header view 
    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
    { 
     let headerView = UIView() 
     headerView.backgroundColor = UIColor.clearColor() 
     return headerView 
    } 

    // calling each cell based on tap and users (premium/non premium) 
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    { 
     if((arrDict[indexPath.row].FeaturedBusiness) != nil) 
     { 
      let cell1:premiumUsercell = tableView.dequeueReusableCellWithIdentifier("cell3") as! premiumUsercell 

      cell1.phoneNumber = arrDict[indexPath.section].ContactNumber! 
      cell1.vendorName3.text = arrDict[indexPath.section].BusinessName 
      cell1.vendorAdddress3.text = arrDict[indexPath.section].Address 
      cell1.VendorRating3.rating = arrDict[indexPath.section].Rating! 

      cell1.latlng = arrDict[indexPath.section].BusinessLatLng! 

      latlng = arrDict[indexPath.section].BusinessLatLng! 


      let FeaturedValues = arrDict[indexPath.row].FeaturedBusiness 

      cell1.FeaturedDisplayText.text = FeaturedValues!.valueForKey("display_text") as? String 

      let BImage = arrDict[indexPath.section].StoreImages 

      let BMainImage = BImage![0] as! NSDictionary 

      let FinalImage = BMainImage.valueForKey("url") as! String 

      if let imgURL2 = NSURL(string: FinalImage) 
      { 
       let request: NSURLRequest = NSURLRequest(URL: imgURL2) 

       let session = NSURLSession.sharedSession() 

       let Imgtask = session.dataTaskWithRequest(request) 
       { 
        (data, response, error) -> Void in 

        if (error == nil && data != nil) 
        { 
         func display_image() 
         { 
          cell1.vendorImage.image = UIImage(data: data!) 
         } 
         dispatch_async(dispatch_get_main_queue(), display_image) 
        } 
       } 
       Imgtask.resume() 
      } 
      cell1.getDirectionButton.addTarget(self, action: #selector(ContainerViewController.GetDirection), forControlEvents: UIControlEvents.TouchUpInside) 

      return cell1 
     } 




     if searchConroller.active && searchConroller.searchBar.text! != "" { 



      let cell:customCell = tableView.dequeueReusableCellWithIdentifier("cell") as! customCell 

      cell.vendorName.text = filteredData[indexPath.row].BusinessName 
      cell.vendorAddress.text = filteredData[indexPath.row].Address 
      cell.VendorRating.rating = filteredData[indexPath.row].Rating! 
      return cell 
     } 
     else 

     { 
      let cell:customCell = tableView.dequeueReusableCellWithIdentifier("cell") as! customCell 

      cell.vendorName.text = arrDict[indexPath.row].BusinessName 
      cell.vendorAddress.text = arrDict[indexPath.row].Address 
      cell.VendorRating.rating = arrDict[indexPath.row].Rating! 
      return cell 
     } 
    } 


    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    { 
     let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 

     let vc: BusinessDetailViewController = storyboard.instantiateViewControllerWithIdentifier("BusinessDetailViewController") as! BusinessDetailViewController 

     if searchConroller.active && searchConroller.searchBar.text! != "" { 
      vc.BusinessData = filteredData[indexPath.row] 

     } 
     else { 
      vc.BusinessData = arrDict[indexPath.row] 

     } 


     self.presentViewController(vc, animated: true, completion: nil) 


    } 



} 

extension ContainerViewController: UISearchResultsUpdating { 
    func updateSearchResultsForSearchController(searchController: UISearchController) { 
     filterContentForSearch(searchConroller.searchBar.text!) 
    } 

} 

これが私の最初のプロジェクトである、解決するために私を助けてくださいout.How。

おかげ

+0

例外ブレークポイントを追加し、クラッシュする行を確認してください –

+0

クラッシュを引き起こすだけの最小コードを投稿できますか? – user1046037

答えて

3

ボタンがモーダル新しいビューコントローラを提示しようとする試みをタップしている場合に発生することができます。 UISearchControllerが既に表示されているため、予期しない動作が発生したり、例外が発生する可能性があります。

ボタンアクションにセグをトリガーするコードがある場合は、セグのタイプを表示に変更してみてください。インターフェイスビルダを使用している場合、これは属性インスペクタのKindプロパティになります。