2013-07-05 4 views
0

У меня есть приложение 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. И да, я новичок в этом.

+0

является 'didSelectRowAtIndexPath:' вызывался? Вы пытались установить там точку останова? На первый взгляд либо '_delegate' равен нулю, либо делегат tableview равен нулю. –

+0

Вы должны сделать некоторые записи, чтобы узнать, где все идет не так, но вы действительно не должны использовать NSNotification для передачи данных в подробный вид. Если это приложение на основе разбитого представления, контроллер главного представления должен знать, что представляет собой контроллер детали (через self.splitViewController.viewControllers [1]), поэтому нет необходимости использовать уведомление. – rdelmar

+0

Я установил точку останова на 'Player * selectedPlayer = '... и он приостановил приложение, когда я нажал на имя в TableView. @rdelmar, что вы имеете в виду, что я не должен использовать NSNotification? Зачем? Я не говорю, что вы ошибаетесь (честно говоря, я не знаю), но он работает для меня прямо сейчас, и если я не знаю, почему я прекратил использовать что-то, что работает, тогда я буду продолжать использовать его. Если я что-то делаю неправильно, скажите мне, что и почему, и я с радостью перестану это делать. – CaptJak

ответ

1

Вы должны поместить NSNotification в

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

[tableView deselectRowAtIndexPath:indexPath animated:YES]; 
//Here you have the NSDictionary from the json 
[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); 
[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); 
//Assuming that you have the players in the same order as your list 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" object:nil userInfo:[[json objectForKey:@"players"]objectAtIndex:indexPath.row]]; 
}]; 


Player *selectedPlayer = [_players objectAtIndex:indexPath.row]; 

if (_delegate) { 
[_delegate selectedPlayer:slectedPlayer]; 
} 
} 

И в вашем DetailViewController:

- (void)handleNotification:(NSNotification *) notification 
{ 
NSLog(@"%@", notification.userInfo); 

nameLabel.text = [notification.userInfo objectForKey:@"name"]; 

}

+0

Хорошо, я думаю, что мы вернулись в путь с этим и почти там.Я поместил код выше в соответствующие пробелы, но я оставил первый '[JSONHTTPClient getJSONFromURLWithString ...', потому что он похож на ошибку копирования, верно? (Я попытался положить его на всякий случай, если это не так, но я получаю тонну синтаксических ошибок). Но теперь я вижу, что когда я выбираю имя, он повторно извлекает данные из БД, но ничего не отображается в DetailView. Всякий раз, когда я выбираю имя, он отображает (null) в журнале для 'NSLog (@"% @ ", notification.userinfo);' в моем DetailViewController.m – CaptJak

+0

, что означает, что notification.userInfo имеет значение null из метода didSelectRow. – soryngod

+0

проверьте, не посылаете ли вы какую-либо информацию оттуда. – soryngod

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