2017-04-07 58 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(),因为数据甚至没有加载以重新加载。