2017-04-07 37 views
12

我試圖設置searchBar作爲tableHeaderViewviewDidLoad內:差異viewDidLoad中

override func viewDidLoad() { 
    super.viewDidLoad() 


    // SearchController initializiation 
    self.searchController = UISearchController.init(searchResultsController: nil) 
    self.searchController.delegate = self 
    self.searchController.searchBar.delegate = self 
    self.searchController.searchBar.sizeToFit() 
    self.searchController.searchResultsUpdater = self 
    self.searchController.searchBar.barTintColor = UIColor.white 
    self.searchController.searchBar.keyboardAppearance = .default 
    self.searchController.searchBar.backgroundColor = UIColor.white 
    self.searchController.hidesNavigationBarDuringPresentation = true 
    self.searchController.obscuresBackgroundDuringPresentation = false 


    self.tableView.tableHeaderView = self.searchController.searchBar 
    self.definesPresentationContext = true 

    self.fetch() 
    self.tableView.reloadData() 

} 

這我fetch()功能:

func fetch() { 
    let fetchRequest:NSFetchRequest<Phone> = Phone.fetchRequest() 
    fetchRequest.sortDescriptors = [NSSortDescriptor.init(key: "header", ascending: true), NSSortDescriptor.init(key: "date", ascending: true)] 

    self.fetchedResultsController = NSFetchedResultsController.init(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: "header", cacheName: nil) 
    self.fetchedResultsController.delegate = self 

    do { 
     try self.fetchedResultsController.performFetch() 
     self.tableView.reloadData() 
    } catch {} 

} 

但我不瞭解他們是行不通的。 Xcode崩潰,實際上沒有發生。然後我試圖改變viewDidLoad裏面的東西方法:

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.fetch() 
    self.tableView.reloadData() 

    // SearchController initializiation 
    self.searchController = UISearchController.init(searchResultsController: nil) 
    self.searchController.delegate = self 
    self.searchController.searchBar.delegate = self 
    self.searchController.searchBar.sizeToFit() 
    self.searchController.searchResultsUpdater = self 
    self.searchController.searchBar.barTintColor = UIColor.white 
    self.searchController.searchBar.keyboardAppearance = .default 
    self.searchController.searchBar.backgroundColor = UIColor.white 
    self.searchController.hidesNavigationBarDuringPresentation = true 
    self.searchController.obscuresBackgroundDuringPresentation = false 


    self.tableView.tableHeaderView = self.searchController.searchBar 
    self.definesPresentationContext = true 



} 

成功了!正常工作。我不明白有什麼區別?

+1

崩潰時的錯誤信息是什麼?它崩潰的確切路線是什麼?請分享堆棧跟蹤。 –

+0

沒什麼!僅在控制檯(lldb) – Mannopson

+1

控制檯中是否有任何信息?您的問題中沒有足夠的信息來解決您的問題。 –

回答

1

這是因爲您在fetchedResultsController初始化之前設置了searchResultsUpdater和searchBar的委託。在您的代碼searchResultsUpdater或searchBar的委託方法中的某些地方正在訪問您的fetchedResultsController並獲取它爲零,所以你的應用程序崩潰。我的建議是避免崩潰是使searchResultsController成爲計算或惰性屬性。

2

您應該嘗試從viewDidLoad()方法中刪除self.tableView.reloadData(),因爲數據甚至沒有加載以重新加載。