0

これに似た問題が発生しています...黒い画面が表示されるのはなぜですか? 私は何かを割り当てませんでしたか?

初心者の質問で申し訳ありませんが、これをデバッグする方法がわかりません。ビュー コントローラの 1 つに空白の (黒い) 画面が表示されます。インスペクターでView Controllerを「is initial View Controller」に設定すると、期待どおりに動作します。ただし、それを削除すると (最初の VC ではなく、デバッグのためにそれを実行しただけです)、ビューに移動すると、空白の (黒い) 画面が表示されます。

VC (referenceDetailWebView) に webview があり、VC の viewDidLoad でそれをログアウトしようとすると、(null) が表示されます。繰り返しますが、VC を「初期」に設定すると、期待どおりに referenceDetailWebView オブジェクトがログアウトされます。

これはVCの実装です...

@implementation DetailViewController

@synthesize currentReference, referenceDetailWebView;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *htmlFile      = [[NSBundle mainBundle] pathForResource:@"reference/accommodation" ofType:@"html"];
    NSString *htmlString    = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:nil];

    [referenceDetailWebView loadHTMLString:htmlString baseURL:nil];

    // log for debugging
    NSLog(@"%@", [self referenceDetailWebView]);

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
     // Dispose of any resources that can be recreated.
}

@end

私が考えることができる唯一のことは、私のセグエで何かが欠けているかもしれないということです. 私はそれらをプログラムで処理していますが、そこに何かを見落としている可能性が非常に高いです...? 私の didSelectRowAtIndexPath は次のようになります...

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    Reference *currentItem = [references objectAtIndex:indexPath.row];
    NSString *mySegueID;

    if([currentItem hasSubReferences]){
        mySegueID = @"ShowSubTable";
    } else {
        mySegueID = @"ShowDetail";
    }

    [self performSegueWithIdentifier:mySegueID sender:nil];

}

そして、私の performSegueWithIdentifier は次のようになります...

- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender{

    // the segue with identifier allows us to chose a segue programatically

    NSIndexPath *path   = [self.tableView indexPathForSelectedRow];
    Reference *item     = [references objectAtIndex:path.row];

    if([identifier isEqualToString:@"ShowSubTable"]){

        // looking for sub table

        ReferencesSubTableViewController *subTableVC = [[ReferencesSubTableViewController alloc] initWithNibName:nil bundle:nil];
        [subTableVC setCurrentReference:item];
        [self.navigationController pushViewController:subTableVC animated:YES];

    } else if ([identifier isEqualToString:@"ShowDetail"]){

        // looking for detail view

        DetailViewController *detailVC = [[DetailViewController alloc] initWithNibName:nil bundle:nil];
        [detailVC setCurrentReference:item];
        [self.navigationController pushViewController:detailVC animated:YES];

    }

}

セグエは、detailViewController が空白の画面を表示し、referenceDetailWebView に null を与えることを除いて、期待どおりに機能しています。

私は立ち往生しています。アドバイスやガイダンスは大歓迎です!事前に助けてくれてありがとう!!


編集: おそらくセグエが原因のようです。複数のセグエと関連コードを削除し、テーブル セルから DetailViewController のみに単純なセグエを追加すると、detailVC とビューが正しく読み込まれます。セグエで何が欠けているのかわからない...?

performSegueWithIdentifier を次のように単純化しましたが、まだ空白の画面が表示されます...

- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender{ 

    NSIndexPath *path   = [self.tableView indexPathForSelectedRow];
    Reference *item     = [references objectAtIndex:path.row];

    DetailViewController *detailVC = [[DetailViewController alloc] initWithNibName:nil bundle:nil];

    [detailVC setCurrentReference:item];
    [detailVC setTitle:[item title]];
    [self.navigationController pushViewController:detailVC animated:YES];

}
4

1 に答える 1

0

コントローラーを正しくインスタンス化していないため、黒い画面が表示されます。また、pushViewController:animated: を使用してビュー コントローラーをプッシュしないでください。これは、performSegueWithIdentifier: を呼び出すときに行われます。ストーリーボードにセグエのセットアップがある場合は、performSegueWithIdentifier: ではなく、prepareForSegue:sender: を実装する必要があります。そのコードは次のようになります。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    // the segue with identifier allows us to chose a segue programatically

    NSIndexPath *path   = [self.tableView indexPathForSelectedRow];
    Reference *item     = [references objectAtIndex:path.row];

    if([segue.identifier isEqualToString:@"ShowSubTable"]){

        // looking for sub table

        ReferencesSubTableViewController *subTableVC = (ReferencesSubTableViewController *)segue.destinationViewController; 
        [subTableVC setCurrentReference:item];

    } else if ([segue.identifier isEqualToString:@"ShowDetail"]){

        // looking for detail view

        DetailViewController *detailVC = (DetailViewController *)segue.destinationViewController;
        [detailVC setCurrentReference:item];
    }
}

ビュー コントローラとセグエに関する Apple のドキュメントを読んで理解する必要があります。

于 2013-01-22T00:05:34.763 に答える