2014-09-13 10 views
25

Come si corregge quanto segue in modo che non vengano visualizzati avvisi? Cosa mi manca?searchDisplayController deprecato in iOS 8

Quando si corregge il searchResultsController per searchController mi dà un errore "oggetto trovato"

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; 
} 
+3

e cosa che potrebbe essere gemella? vedi post modificato sopra per favore ... –

+1

Non ce n'è uno. Puoi aggiungere il tuo ivar o proprietà per tenerne traccia quando necessario. – rmaddy

+4

stai scherzando vero? perché dovrei fare questo per realizzare un compito così facile che è sempre stato fornito gratuitamente? cosa pensa Apple? –

risposta

12

La classe UISearchController sostituisce la classe UISearchDisplayController per la gestione della visualizzazione delle interfacce di ricerca correlati.

Fonte: https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html

Quindi, come ha detto rmaddy, se si vuole sbarazzarsi delle avvertenze deprecati, smettere di usare le classi deprecate. Utilizzare UISearchController invece:

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

+9

Sarebbe utile se Apple rimuovesse le classi deprecate da Interface Builder. –

4

stavo cercando di migrare da UISearchDisplayController a UISearchController. Quindi, ho trovato questo su GitHub: https://github.com/dempseyatgithub/Sample-UISearchController
Download/clonarlo e sarete in grado di vedere come utilizzare UISearchController con UITableView e UICollectionView.
Ha tutto il necessario per l'aggiornamento da UISearchDisplayController a UISearchController.
La documentazione UISearchController è anche molto utile. Per iniziare, guarda l'esempio- UISearchController/MasterViewController_TableResults.m e Sample-UISearchController/MasterViewController_FilterResults.m
Se devi supportare anche iOS 7 (qualcosa che personalmente raccomando se stai davvero per distribuire la tua app al App Store) fare questo:

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

Nota: dovrete fare tutto programatically se si desidera supportare entrambe le versioni di iOS.

0

Abbiamo lavorato a lungo per far ruotare correttamente il nuovo UISearchController.

Ecco ciò che sembrava prima:

Dopo molto tempo abbiamo essenzialmente "rinunciato" a fare il lavoro di rotazione in modo corretto. Invece semplicemente nascondiamo il controller di ricerca prima che avvenga la rotazione. L'utente deve quindi toccare il pulsante di ricerca sulla visualizzazione ruotata per visualizzare nuovamente la barra di ricerca.

Ecco il codice rilevante:

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

Nota importante: Il nostro codice utilizza un UIViewController e non UITableViewController. Lo schermo richiede pulsanti aggiuntivi ed è per questo che non possiamo usare UITableViewController. L'utilizzo di UISearchController su un UITableViewController non presenta problemi di rotazione.

Consideriamo questo come un lavoro necessario dato lo stato attuale di UISearchController. Sarebbe molto meglio avere una soluzione reale a questo problema.

8

Aggiungi questo al tuo.h di file

<UISearchBarDelegate,UISearchResultsUpdating> 

NSArray *searchResultsArray; 
NSMutableArray *userMutableArray; 

@property (retain, nonatomic) UISearchController *searchController; 

e questo al vostro file .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; 
} 
+1

Questa risposta funziona alla grande. –

+0

Questa è la migliore risposta alla domanda originale: mostra un esempio pratico e funzionante di come convertire dall'usato UISearchDisplayController a UISearchController. – mbbeme

+0

risposta semplice e dettagliata. –