web-dev-qa-db-ja.com

iOS 8で廃止されたsearchDisplayController

警告が表示されないように、以下をどのように修正しますか?私は何が欠けていますか?

searchResultsControllersearchControllerに修正すると、「オブジェクトが見つかりません」というエラーが表示されます

if (tableView == self.searchDisplayController.searchResultsTableView) {
        cell.textLabel.text = [searchResults objectAtIndex:indexPath.row];
    } else {
        cell.textLabel.text = [_content objectAtIndex:indexPath.row];
    }

    return cell;
}

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller
  shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                       objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
    return YES;
}
25
George Asda

UISearchControllerクラスは、検索関連インターフェースの表示を管理するためのUISearchDisplayControllerクラスを置き換えます。

ソース: https://developer.Apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html

したがって、rmaddyが言ったように、廃止された警告を取り除きたい場合は、廃止されたクラスの使用をやめてください。代わりにUISearchControllerを使用します。

https://developer.Apple.com/library/ios/documentation/UIKit/Reference/UISearchController/index.html#//Apple_ref/occ/cl/UISearchController

12
michaelsnowden

これを.hファイルに追加します

<UISearchBarDelegate,UISearchResultsUpdating>

NSArray *searchResultsArray;
NSMutableArray *userMutableArray;

@property (retain, nonatomic) UISearchController *searchController;

これを.mファイルに

userMutableArray = [[NSMutableArray alloc] initWithObjects:@"Jack",@"Julie", nil];
searchResultsArray = [[NSArray alloc]init];

self.searchController = [[UISearchController alloc]initWithSearchResultsController:nil];
self.searchController.searchBar.scopeButtonTitles = [[NSArray alloc]initWithObjects:@"UserId", @"JobTitleName", nil];
self.searchController.searchBar.delegate = self;
self.searchController.searchResultsUpdater = self;
[self.searchController.searchBar sizeToFit];
self.searchController.dimsBackgroundDuringPresentation = NO;
self.definesPresentationContext = YES;
self.tableView.tableHeaderView = self.searchController.searchBar;


-(void)updateSearchResultsForSearchController:(UISearchController *)searchController{
    NSString *searchString = self.searchController.searchBar.text;
    NSPredicate *resultPredicate;
    NSInteger scope = self.searchController.searchBar.selectedScopeButtonIndex;
    if(scope == 0){
        resultPredicate = [NSPredicate predicateWithFormat:@"userId contains[c] %@",searchString];
    }else{
        resultPredicate = [NSPredicate predicateWithFormat:@"jobTitleName contains[c] %@",searchString];
    }
    searchResultsArray = [userMutableArray filteredArrayUsingPredicate:resultPredicate];
    [self.tableView reloadData];
}

- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope{
    [self updateSearchResultsForSearchController:self.searchController];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if(self.searchController.active){
        return [searchResultsArray count];
    }else{
        return [userMutableArray count];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if(!cell){
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    if(self.searchController.active){
        cell.textLabel.text = [searchResultsArray objectAtIndex:indexPath.row];
    }else{
        cell.textLabel.text = [userMutableArray objectAtIndex:indexPath.row];
    }
    return cell;
}
9
RStack

UISearchDisplayControllerからUISearchControllerに移行しようとしていました。だから、私はGitHubでこれを見つけました: https://github.com/dempseyatgithub/Sample-UISearchController
ダウンロード/クローンを作成すると、UISearchControllerUITableViewUICollectionViewを使用する方法を確認できます。
UISearchDisplayControllerからUISearchControllerへのアップグレードに必要なものがすべて揃っています。
UISearchControllerドキュメントも非常に役立ちます。はじめに、Sample-UISearchController/MasterViewController_TableResults.mおよびSample-UISearchController/MasterViewController_FilterResults.mをご覧ください。
iOS 7もサポートする必要がある場合(アプリをApp Storeに展開する場合は個人的にお勧めします)、次のようにします。

if([UISearchController class]){
//Create an UISearchController and add it to your UITableViewController
}else{
//Create an UISearchDisplayController and add it to your UITableViewController 
}

注:iOSの両方のバージョンをサポートする場合は、プログラムですべてを行う必要があります。

4

長い間、新しいUISearchControllerを適切に回転させるために取り組んできました。

以前の外観は次のとおりです。

かなりの時間が経過した後、回転を適切に機能させることを基本的に「放棄」しました。代わりに、回転が発生する前に検索コントローラーを非表示にします。ユーザーは、回転したビューの検索ボタンをタップして、検索バーを再度表示する必要があります。

関連するコードは次のとおりです。

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    [self.searchController dismissViewControllerAnimated:YES completion:nil];
    self.searchControllerWasActive = NO;
    self.searchButton.enabled = YES;
}

重要な注意:コードでは、UITableViewControllerではなくUIViewControllerを使用します。画面には追加のボタンが必要なので、UITableViewControllerを使用できません。 UITableViewControllerでUISearchControllerを使用しても、回転の問題は発生しません。

UISearchControllerの現在の状態を考えると、これは回避策として必要です。この問題の本当の解決策があればもっといいでしょう。

0
Stephen Mlawsky