У меня есть приложение MasterDetail, над которым я работаю, и будет использоваться для показа игроков (как в спортивных состязаниях) и подробных статистических данных. Список игроков вызывается из базы данных Postgres и анализируется JSON с использованием JSONModel. До сих пор я могу получить все данные, которые мне нужны из DB Postgres, и отлично отобразить его в MasterView. Я использую NSNotificationCenter для передачи данных из представления Master в Detail (я извлекаю данные с помощью функции в MasterView). Я могу точно передать данные в подробный вид, но по какой-то причине моя didSelectRowAtIndexPath работает неправильно. Я, очевидно, сделал что-то не так, но я понятия не имею, что это. Вот важные части кода:didSelectRowAtIndexPath не работает с NSNotificationCenter
В MasterViewController.m viewDidAppear:
-(void)viewDidAppear:(BOOL)animated
{
//fetch the feed from the Postgres Database
[JSONHTTPClient getJSONFromURLWithString:@"http://myurl" completion:^(NSDictionary *json, JSONModelError *err) {
NSError* error = nil;
_feed = [[PostgresFeed alloc]initWithDictionary:json error:&error];
//Print the data fethced to NSLog in JSON format
NSLog(@"Players: %@", _feed.players);
[[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" object:nil userInfo:json];
//reload the table view after data collected
[self.tableView reloadData];
}];
}
и я собирать эту информацию в моем DetailViewController.m так:
- (void)handleNotification:(NSNotification *) notification
{
NSLog(@"%@", notification.userInfo);
NSArray *playerData = [notification.userInfo objectForKey:@"player"];
NSDictionary *firstElement = [playerData objectAtIndex:0];
nameLabel.text = [firstElement objectForKey:@"name"];
}
, а затем мой didSelectRowAtIndexPath
в моем MasterViewController
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
Player *selectedPlayer = [_players objectAtIndex:indexPath.row];
if (_delegate) {
[_delegate selectedPlayer:slectedPlayer];
}
}
У вас есть это. Если вы хотите, чтобы я опубликовал больше или вам нужен код из DetailViewController.m, MasterViewController.h или PlayerSelectionDelegate.h, просто дайте мне знать.
В качестве примечания, я изначально создал это, основанный на приложении для iPad iPad SplitView. И да, я новичок в этом.
является 'didSelectRowAtIndexPath:' вызывался? Вы пытались установить там точку останова? На первый взгляд либо '_delegate' равен нулю, либо делегат tableview равен нулю. –
Вы должны сделать некоторые записи, чтобы узнать, где все идет не так, но вы действительно не должны использовать NSNotification для передачи данных в подробный вид. Если это приложение на основе разбитого представления, контроллер главного представления должен знать, что представляет собой контроллер детали (через self.splitViewController.viewControllers [1]), поэтому нет необходимости использовать уведомление. – rdelmar
Я установил точку останова на 'Player * selectedPlayer = '... и он приостановил приложение, когда я нажал на имя в TableView. @rdelmar, что вы имеете в виду, что я не должен использовать NSNotification? Зачем? Я не говорю, что вы ошибаетесь (честно говоря, я не знаю), но он работает для меня прямо сейчас, и если я не знаю, почему я прекратил использовать что-то, что работает, тогда я буду продолжать использовать его. Если я что-то делаю неправильно, скажите мне, что и почему, и я с радостью перестану это делать. – CaptJak