UISearchDisplayContoller – can't prevent table reload on typing in search bar


http://stackoverflow.com/questions/3903718/uisearchdisplaycontoller-cant-prevent-table-reload-on-typing-in-search-bar/5342989#5342989


This is just the way UISearchDisplayController (SDC) works. When the user enters the first character into the searchBar the searchTable is loaded and displayed for the first time causing it to load. The methods "...shouldReloadTableForSearchString" and "...shouldReloadTableForSearchScope" allow you to control whether the searchTable reloads automatically on subsequent chars or a scope change.

I've done both of the following to provide a good user experience on the first character. Slight disclaimer: I do have implementations of both of these that work but this is simply a framework for implementation from my memory. I may have missed a detail but this should get you pretty close.

Option 1: Present a "loading" cell in the searchTable when the first char is typed.

This option allows the SDC to display the searchResultsTableView when the user types the first char, display status as to the current search/filter operation

  1. in the SDC delegate class definition

    • add the iVar BOOL isLoading
    • add the iVar UITableView *searchTableView
  2. in searchDisplayController:didLoadSearchResultsTableView

    • set searchTableView = tableView
  3. in shouldReloadTableForSearchString/Scope

    • set isLoading = YES
    • call your method to load data in the background
    • return NO
  4. when your background filter is complete:

    • set isLoading = NO
    • [searchTableView reloadData]
  5. in the various tableView delegate methods respond how you like to show status if there are current search results or results are loading in the background. What I did is:

    • if there are current search results, show results (even if loading/filtering in the background)
    • if there are no search results and isLoading == NO return 1 row and show 'No matches' in a cell
    • if there are no search results and isLoading == YES return 1 row and and show search activity in a cell (I typically use UIActivityIndicatorView)

Option 2: Hide the searchTableView and display an overlay view in it's place until search results are loaded

This option hides the searchTableView when it is first loaded and only redisplays it if when the search/filter is complete. I defined this as an add on to option 1 as they can be done together though to optimize things you may not care about showing search activity in the searchResultsTableView if you are hiding the table and showing the overlay.

  1. in the SDC delegate class definition

    • same as Option 1
    • add the iVar UIView *searchTableOverlayView
  2. in searchDisplayController:didLoadSearchResultsTableView

    • same as Option 1
    • create a UIView to use as an overlay in place of searchTableView containing whatever UI is appropriate for your app and set it to searchTableOverlayView
  3. in searchDisplayController:didUnloadSearchResultsTableView

    • release searchTableOverlayView
  4. in 'searchDisplayController:didShowSearchResultsTableView(may be able to do this insearchDisplayController:willShowSearchResultsTableView`

    • if there are search results to display or isLoading == NO
      • seachTableOverlayView.hidden == YES
    • else (if isLoading == YES)
      • searchTableOverlayView.frame == searchResultsTableView.frame
      • add seachTableOverlayView as a subview of searchTableVIew.superview
      • searchTableView.hidden = YES
  5. when your background filter is complete

    • same as option 1
    • if there are searchResults to display
      • searchTableCoverView.hidden = YES'</li> <li>searchResultsTableView.hidden = NO'
    • else
      • searchResultsTableView.hidden = YES
      • searchTableCoverView.hidden = NO
  6. in the various tableView delegate methods respond how you like to show status if there are current search results or results are loading in the background. What I did is:

    • same as option 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值