0

UITableViewストーリーボード セグエを介してプッシュする があります。このビューには、 で選択したアクセサリのにUILabel関連するテキストを変更したい が表示されます。indexPath.rowUITableView

私はそれがおそらく非常に間違っていることを知っていますが、これは私の試みでした. 私はそれについて非常に間違っているように感じます:

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"ArticlePreviewSegue" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath *indexPath = [sender indexPathForSelectedRow];
    ArticlePreviewViewController *apvc = [segue destinationViewController];
    NSDictionary *article = [_newsFetcher.articles objectAtIndex:indexPath.row];
    apvc.titleLabel.text = [article objectForKey:@"title"];
    apvc.bodyLabel.text = [article objectForKey:@"body"];
}

ありがとうございます!

4

1 に答える 1

2

問題の 1 つは、アクセサリをタップしても行が選択されないことです。セグエの送信者としてインデックス パスを渡すことで、これを処理できます。

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
    [self performSegueWithIdentifier:@"ArticlePreviewSegue" sender:indexPath];
}

prepareForSegue:sender:行が選択されていることに依存せずに、インデックス パスにアクセスできるようになりました。

もう 1 つの問題はprepareForSegue:sender:apvcがそのビューをまだロードしていないことです。したがってapvc.titleLabel、 とapvc.bodyLabelは両方ともゼロです。

これを処理する適切な方法は、次のようにArticlePreviewViewControllerarticleプロパティを指定して でそのプロパティを設定することです。prepareForSegue:sender:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath *indexPath = (NSIndexPath *)sender;
    ArticlePreviewViewController *apvc = [segue destinationViewController];
    apvc.article = [_newsFetcher.articles objectAtIndex:indexPath.row];
}

次に、-[ArticlePreviewViewController viewDidLoad]記事に基づいてラベルを設定できます。

- (void)viewDidLoad {
    [super viewDidLoad];
    self.titleLabel.text = self.article[@"title"];
    self.bodyLabel.text = self.article[@"body"];
}
于 2012-10-15T02:45:59.677 に答える