0

私は(とりわけ)単純なFacebookフィードを作成するタブ付きアプリに取り組んでいます。FacebookセクションはUINavigationController、マスターテーブルビューと詳細ビューを保持しています。マスターテーブルビューの行の1つをクリックすると、意図したとおりに詳細ビュー(および適切に入力されたラベル)が表示されます。ただし、マスタービューに戻って別の行を選択すると、何か奇妙なことが起こります。たとえば、「detailLab」ラベル(sizeToFit'd)が最初の詳細ビューで4行の長さであり、「detailLab」ラベルが2番目の詳細ビューで2行の長さであった場合、2回目の出現で詳細ビューの「detailLab」は最初の2行を正しく表示しますが、その下には、詳細ビューの最初の出現からの最後の2行が表示されます。

この出来事の写真

そして、いくつかの(うまくいけば)関連するコード:

- (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

より適切な解決策は、ラベル ビューを に追加し、viewDidLoad既存のビューの位置のみを変更することですviewWillAppear。でビューを破棄することを覚えておく必要があります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 の上部にあるラベルをリセットすることでした。

1 つのオプションは、viewDidUnload でそれを削除することです。もう 1 つは、以下のようなコードのセグメントを使用して、毎回ラベルをリセットすることです。これは、実際にコンテンツに読み込まれるコードのセクションの上に配置されます。

detailLab = [NSString stringWithFormat:@""];

問題は、ほとんどのマスター/詳細ビューのセットアップでは、ビューを追加するたびに新しい詳細ビューを実際に作成するのではなく、マスター ビュー セクションで同じビューへの別のリンクを作成するだけであるということです。これは問題ありませんが、viewDidUnload をたくさん使用することを覚えておく必要があります。

それが役に立てば幸い

于 2012-08-08T01:43:15.967 に答える