0

私の DetailViewController.h で、以下に示すように * プロパティ タイプを宣言しました。

@interface DetailViewController : UIViewController
    @property (strong, nonatomic) NSString *type;
@end

次に、TableView を含む UIViewController である ListViewController を取得しました。ListViewController.h は次のようになります。

@interface ListViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
@end

私の ListViewController.m で * タイプの値を変更したいのですが、すぐにビューを切り替えます (ビューの切り替えは正常に機能しています)。

以下を追加してこれを行っています。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UINavigationController * navigationController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailController"];
    DetailViewController * detailController = [[DetailViewController alloc] init];

    detailController.type = @"video";

    NSLog(@"Type: %@", detailController.type);

    [self.navigationController pushViewController:navigationController animated:YES];
}

このブロック/関数の 2 行目にブレークポイントを配置すると、detailController が * タイプで取得されます。これを数行後に NSLog すると、「(null)」が返されます。ビューは変更されますが、タイプは設定されていません。

私は何が間違っているのか理解できませんか?これに対する解決策を持っている人、または私たちがこれについて説明していることを私に指摘できる人はいますか?

答えを探してみましたが、私の問題に相当するものを見つけることができなかったか、間違った検索用語を使用したためです..

4

5 に答える 5

1

didSelectRowAtIndexPath:メソッドで次の行を変更します`

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

    DetailViewController * detailController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailController"];;

    detailController.type = @"video";

    NSLog(@"Type: %@", detailController.type);

    [self.navigationController pushViewController: detailController animated:YES];
}`

DetailViewControllerストーリーボードで、ストーリーボードIDを「DetailController」として選択して指定します。ListViewControllerが に埋め込まれていることを確認してください。UINavigationControllerこれを行うには、 を選択ListViewControllerして に移動しeditor->Embed in->Navigation Controllerます。次の手順に従ってください。問題は解決します。

または、ListViewController から DetailViewController にセグエを与えて使用することもできます

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath *path = [self.tableView indexPathForSelectedRow]; //create tableview outlet
    [segue.destinationViewController setType:@"video"];
}
于 2013-11-06T12:36:32.350 に答える
1

これは何のため?

UINavigationController * navigationController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailController"];

ナビゲーションコントローラー内にナビゲーションコントローラーをプッシュしているのはなぜですか?

[self.navigationController pushViewController:navigationController animated:YES];

detailController使用または表示されませんでした。

代わりにこれを試してください:

[self.navigationController pushViewController:detailController animated:YES];
于 2013-11-06T12:28:11.130 に答える
1

最後の行を見てください - あなたはナビゲーションコントローラーに自分自身をプッシュするように伝えています!

于 2013-11-06T12:28:43.300 に答える
0

ナビゲーション コントローラーと alloc-init メソッドは両方とも、保存ビュー コントローラーをインスタンス化しますか??

はいの場合、これを試してください

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController * detailController = [[DetailViewController alloc] init];

detailController.type = @"video";

NSLog(@"Type: %@", detailController.type);

[self.navigationController pushViewController:detailController animated:YES];
}
于 2013-11-06T12:35:51.577 に答える
0

このようになるはずです

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DetailViewController * detailController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailController"];

    detailController.type = @"video";

    NSLog(@"Type: %@", detailController.type);

    [self.navigationController pushViewController:detailController animated:YES];
}
于 2013-11-06T12:31:21.380 に答える