2014-05-08 3 views
1

Я просто добавил панель поиска в свое приложение для iPhone, которое должно искать в TableViewController песен. Однако, когда я бегу мое приложение на моем iPhone, он застывает с черным экраном, и я получаю эту ошибку: unrecognized selector sent to instance на этой линии:«Непризнанный селектор, отправленный в экземпляр» - ошибка при добавлении строки поиска

MPMediaItem *rowItem = [songs objectAtIndex:indexPath.row]; 

в этом блоке:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    // Configure the cell... 

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

    MPMediaItem *rowItem = [songs objectAtIndex:indexPath.row]; 

    cell.textLabel.text = [rowItem valueForProperty:MPMediaItemPropertyTitle]; 
    cell.detailTextLabel.text = [rowItem valueForProperty:MPMediaItemPropertyArtist]; 

    return cell; 
} 

Это моя реализация код:

@implementation SongsViewController 
{ 
    NSArray *searchResults; 
    NSArray *songs; 
} 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    MPMediaQuery *songsQuery = [MPMediaQuery songsQuery]; 
    songs = [songsQuery items]; 
} 

#pragma mark - Table view data source 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (tableView == self.searchDisplayController.searchResultsTableView) { 
     return [searchResults count]; 

    } else { 
     return [songs count]; 
    } 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    // Configure the cell... 

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

    MPMediaItem *rowItem = [songs objectAtIndex:indexPath.row]; 

    cell.textLabel.text = [rowItem valueForProperty:MPMediaItemPropertyTitle]; 
    cell.detailTextLabel.text = [rowItem valueForProperty:MPMediaItemPropertyArtist]; 

    return cell; 
} 

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText]; 
    searchResults = [songs filteredArrayUsingPredicate:resultPredicate]; 
} 

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

    return YES; 
} 

Я не понимаю, что случилось? Ошибка: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MPConcreteMediaItem objectAtIndex:]: unrecognized selector sent to instance 0x178221e20'.

Любая помощь будет очень признательна!

+0

ли вы потрудились Google это сообщение? –

+1

Голосование за повторным открытием, потому что в ответах на этот «дублирующий» вопрос нет ничего, что каким-либо образом помогло бы решить проблему в этом вопросе. – rmaddy

ответ

2

Изменить этот код:

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

MPMediaItem *rowItem = [songs objectAtIndex:indexPath.row]; 

к этому:

MPMediaItem *rowItem; 
if (tableView == self.searchDisplayController.searchResultsTableView) { 
    rowItem = [searchResults objectAtIndex:indexPath.row]; 
} else { 
    rowItem = [songs objectAtIndex:indexPath.row]; 
} 
+0

Спасибо, но теперь я получаю ошибку SIGABRT - «*** Завершение приложения из-за неотображенного исключения« NSUnknownKeyException », причина:« [ valueForUndefinedKey:]: этот класс не является ключевым значением, совместимым с кодировкой для ключевое имя. '' – user3127576

+1

Какая именно строка кода вызывает эту ошибку? – rmaddy

+0

Он появился на линии 'return UIApplicationMain (argc, argv, nil, NSStringFromClass ([Класс AppDelegate])); в файле Поддержка файлов> main.m – user3127576

1

Проблема происходит из-за следующей строки:

songs = [songs objectAtIndex:indexPath.row]; 

Вы назначаете MPMediaItemNSArray к объекту. И в следующий раз, когда вы попытаетесь использовать [songs objectAtIndex:indexPath.row]; Это сбой.

+0

Спасибо, что помогли мне, как бы исправить это? Что я могу заменить 'songs = [песни objectAtIndex: indexPath.row]; с? Спасибо – user3127576

+1

@ user3127576: удалите эту часть и проверьте –

+0

Спасибо, теперь она загружает и показывает песни, но когда я нажимаю символ на клавиатуре в строке поиска, я получаю ошибку SIGABRT - «*** Завершение приложения из-за неотображения exception 'NSUnknownKeyException', reason: '[ valueForUndefinedKey:]: этот класс не является ключевым значением, совместимым с кодировкой для имени ключа.' ": S Спасибо – user3127576

Смежные вопросы