0

我正在开发一个选项卡式应用程序,该应用程序(除其他外)创建一个简单的 Facebook 提要。Facebook 部分是UINavigationController一个主表视图和一个详细视图。当我单击主表视图中的某一行时,它会按预期显示详细视图(以及适当填充的标签)。但是,如果我回到主视图并选择另一行,就会发生一些奇怪的事情。如果“detailLab”标签(即sizeToFit'd)在 Detail View 第一次出现时为四行,而在 Detail View 第二次出现时“detailLab”标签为 2 行,那么在第二次出现时在 Detail View 中,“detailLab”将正确显示前两行,但在它们下方将是第一次出现的 Detail View 的最后两行。

发生这种情况的照片

还有一些(希望)相关的代码:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    CGRect labelFrame = CGRectMake(100, 40, 220, 150);
    detailLab = [[UILabel alloc] initWithFrame:labelFrame];
    [detailLab setTextColor:[UIColor darkGrayColor]];
    detailLab.font = [UIFont systemFontOfSize:14];

    [detailLab setText:detail];
    [detailLab setNumberOfLines:0];
    [detailLab sizeToFit];

    [self.view addSubview:detailLab];

    NSURL *url = [NSURL URLWithString:pictureString];
    NSData *imageData = [[NSData alloc] initWithContentsOfURL:url];
    picture = [UIImage imageWithData:imageData];
    bigImage.image = picture;
    NSLog(@"dateString: %@", dateString);
    dateLabel.text = dateString;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    bigImage = nil;
    detailLab = nil;
    detailLab.hidden = YES;
    // Release any retained subviews of the main view.
    self.detailDescriptionLabel = nil;
}

如果您需要任何其他代码或详细信息,请询问;我很乐意提供。

4

2 回答 2

1

问题是每次viewWillAppear被调用时,您都在创建一个新标签,而我假设没有在viewWillDisappear. 所以标签堆积起来,一个在另一个之上。

请记住,您可能会被这样调用(忽略不相关的调用):

viewDidLoad

viewWillAppear
viewWillDisappear

viewWillAppear        <- Whoops! Two labels
viweWillDisappear

viewDidUnload

一个更简洁的解决方案是将您的标签视图添加viewDidLoadviewWillAppear. 您仍然需要记住在viewDidUnLoad.

这就是我的意思(请注意,这只是编译的眼球,因此您可能需要更正一些错别字):

- (void)viewDidLoad
{
    [super viewDidLoad];
    detailLab = [[UILabel alloc] initWithFrame:CGRectZero];
    [detailLab setTextColor:[UIColor darkGrayColor]];
    detailLab.font = [UIFont systemFontOfSize:14];
    [self.view addSubview:detailLab];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    CGRect labelFrame = CGRectMake(100, 40, 220, 150);
    [detailLab setFrame:labelFrame];
    [detailLab setText:detail];
    [detailLab setNumberOfLines:0];
    [detailLab sizeToFit];

    NSURL *url = [NSURL URLWithString:pictureString];
    NSData *imageData = [[NSData alloc] initWithContentsOfURL:url];
    picture = [UIImage imageWithData:imageData];
    bigImage.image = picture;
    NSLog(@"dateString: %@", dateString);
    dateLabel.text = dateString;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    bigImage = nil;
    detailLab = nil;
    detailLab.hidden = YES;
    // Release any retained subviews of the main view.
    self.detailDescriptionLabel = nil;
}
于 2012-08-08T01:30:10.473 回答
0

这对于主视图到详细视图是正常的 - 令人沮丧,但正常。我遇到问题时找到的解决方案是重置每个 -ViewDidLoad 顶部的标签。

一种选择是在 viewDidUnload 中删除它。另一种方法是每次都重置标签,使用如下所示的一段代码,位于代码实际加载到内容中的部分上方

detailLab = [NSString stringWithFormat:@""];

问题在于,对于大多数主/详细视图的设置,每次添加视图时实际上并没有创建新的详细视图,它只是在主视图部分创建另一个指向同一视图的链接。这很好,但您只需要记住使用 viewDidUnload 批次

希望能帮助到你

于 2012-08-08T01:43:15.967 回答