viewDidLoad 前后的区别

Posted

技术标签:

【中文标题】viewDidLoad 前后的区别【英文标题】:Difference between before and after in viewDidLoad 【发布时间】:2017-04-07 02:38:05 【问题描述】:

我尝试将searchBar 设置为tableHeaderView 内的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




成功!工作正常。我不明白有什么区别?

【问题讨论】:

崩溃时的错误信息是什么?它崩溃的确切线路是什么?请分享堆栈跟踪。 没什么!仅在控制台中 (lldb) 控制台中有信息吗?您的问题中没有足够的信息来解决您的问题。 @JonRose 你是说 UISearchResultsUpdating 协议吗? 是的。我的意思是UISearchResultsUpdatingUISearchBarDelegate。在设置 fetchedResultsController 之前,viewController 被设置为两个不同对象(searchBar.delegatesearchResultsUpdater)的委托。因此它可以立即获取它们调用的方法。如果这些方法假定存在 fetchedResultsController 设置,则可能会导致逻辑错误。 【参考方案1】:

您应该尝试从viewDidLoad() 方法中删除self.tableView.reloadData(),因为甚至没有加载数据以进行重新加载。

【讨论】:

【参考方案2】:

这是因为您在初始化 fetchedResultsController 之前就设置了 searchResultsUpdater 和 searchBar 的委托。在您的代码中的某些地方 searchResultsUpdater 或 searchBar 的委托方法正在访问您的 fetchedResultsController 并将其设置为零,因此您的应用程序崩溃了。我的建议是避免崩溃是将 searchResultsController 设置为计算属性或惰性属性。

【讨论】:

以上是关于viewDidLoad 前后的区别的主要内容,如果未能解决你的问题,请参考以下文章

viewDidLoad 和 viewDidAppear 的区别

在 viewDidAppear 之前无法正确设置框架

swift 中 awakeFromNib() 和 viewDidLoad() 之间的区别

viewDidLoad和loadView之间的区别?

UIImagePickerController 在调用 alloc init 时真的很慢

loadView和viewDidLoad有什么区别?