0

我遇到了类似的问题...为什么我看到黑屏?我没有分配东西吗?

很抱歉初学者的问题,但我不知道如何调试它。我的一个视图控制器看到一个空白(黑色)屏幕。当我在检查器中将视图控制器设置为“初始视图控制器”时,它按预期工作。但是,当我删除它(它不应该是最初的 VC,只是为了调试)并导航到视图时,我得到一个空白(黑色)屏幕。

VC 中有一个 webview(referenceDetailWebView),当我尝试在 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 之外,segues 正在按预期工作。

我被困住了。非常感谢任何建议或指导!在此先感谢您的帮助!!


编辑: 看起来segues可能是原因。当我删除多个 segue 和相关代码,并将一个简单的 segue 从表格单元格添加到 DetailViewController 时,detailVC 和视图正确加载。不知道我在segues中错过了什么......?

我已将 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: 时,这已经为您完成了。如果您在情节提要中有 segue 设置,那么您应该实现 prepareForSegue:sender:,而不是 performSegueWithIdentifier:。它的代码应该是这样的:

- (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 关于视图控制器和 segue 的文档——你显然对它们的工作方式有一些基本的误解。

于 2013-01-22T00:05:34.763 回答