0

場所のセルがタップされたときに場所のビールの結果を取得するために、prepareForSegue メソッドを使用して LocationTableViewController から BeerTableViewController に location_id を渡しています。私の問題は、location_id が 1 回おきにしか更新されないことです。

例: 場所 1 をタップすると、その場所のビールが読み込まれます。次に、戻るボタンを押して場所 2 をタップしますが、それでも場所 1 のビールが読み込まれます。もう一度打ち返し、場所 2 をもう一度タップすると、正しい場所 2 のビールが表示されます。

正しい location_id をロードするのに 2 回試行する必要があるのはなぜですか?

LocationTableViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{  
    self.selected_location = indexPath.row;
}


-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([[segue identifier] isEqualToString:@"beer"]){
        BeerTableViewController *beer = (BeerTableViewController *)[segue destinationViewController];
        Location *location = [self.location_results objectAtIndex:self.selected_location];
        beer.location_id = location.location_id;
        }
}

次に、BeerTableViewController で location_id を使用して結果を取得します

BeerTableViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *path = [NSString stringWithFormat:@"locations/%@/beers.json", self.location_id];

    [[LocationApiClient sharedInstance] getPath:path parameters:nil
                                        success:^(AFHTTPRequestOperation *operation, id response) {
                                            NSLog(@"Response: %@", response);
                                            NSMutableArray *beer_results = [NSMutableArray array];
                                            for (id beerDictionary in response) {
                                                Beer *beer = [[Beer alloc] initWithDictionary:beerDictionary];
                                                [beer_results addObject:beer];

                                            }
                                            self.beer_results = beer_results;
                                            [self.tableView reloadData];
                                        }
                                        failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                            NSLog(@"Error fetching beers!");
                                            NSLog(@"%@", error);

                                        }];
}
4

1 に答える 1

2

tableView:didSelectRowAtIndexPathは の後 に呼び出されるprepareForSegue:sender:ため、beer ビュー コントローラーで設定したself.selected_location、 を正しい行に設定しています。location_id

これが、次回に正しい行が表示される理由です。Beer View Controller は常に 1 行遅れます。

で、prepareForSegue:sender:UITableView への参照がある場合は、現在選択されている正しい行をテーブル ビューから直接取得できます。

に @property 'tableView' があると仮定すると、LocationTableViewController使用できます[self.tableView indexPathForSelectedRow]

編集

yourLocationTableViewControllerが のサブクラスである場合、UITableViewControllerこの @property は既に存在しますtableView。その場合、prepareForSegue:sender:次のようになります。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([[segue identifier] isEqualToString:@"beer"]){

      BeerTableViewController *beer = (BeerTableViewController *)[segue destinationViewController];
      NSInteger selectedRow = [[self.tableView indexPathForSelectedRow] row];
      Location *location = [self.location_results objectAtIndex:selectedRow];
      beer.location_id = location.location_id;
    }
}
于 2013-03-09T21:14:32.910 に答える