4

UITableView並べ替え可能な行があり、標準UITableViewCell.textプロパティを使用してテキストを表示しています。[編集] をタップして行を移動し、[完了] をタップしてから行をタップすると、組み込みUILabelが完全に白 (テキストと背景) になり、不透明になり、セルの青い影がその背後に表示されなくなります。何を与える?私がしていないことで、私がしなければならないことはありますか?ハックな修正がありますが、本物のマッコイが欲しいです。

これを再現する方法は次のとおりです。

iPhone OS 2.2.1 SDK の標準の「Navigation-Based Application」テンプレートから始めます。

  1. RootViewController.m を開く

  2. コメントviewDidLoadを外し、[編集] ボタンを有効にします。

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        self.navigationItem.rightBarButtonItem = self.editButtonItem;
    }
    
  3. テーブルにいくつかのセルがあることを指定します。

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return 4;
    }
    
  4. tableView:cellForRowAtIndexPath:、セルのテキスト プロパティを設定する行を追加して、組み込みの UILabel サブビューを使用します。

    // Set up the cell...
    cell.text = @"Test";
    
  5. 並べ替えを有効にするには、コメントを外しtableView:moveRowAtIndexPath:toIndexPath:ます。デフォルトの実装は空白ですが、テンプレートにはデータ モデルが含まれていないため、この場合は問題ありません。

  6. Simulator、OS 2.2.1、Build and Go 用にプロジェクトを構成します。アプリが表示されたら、[編集] をタップし、任意の行を新しい位置にスライドさせ、[完了] をタップしてから、各行を一度に 1 つずつタップします。通常、タップすると行が選択され、青に変わり、テキストが白に変わります。しかし、移動したばかりの行をタップする、UILabel の背景色が白のままになります。その結果、端に青い帯が付いた紛らわしい白いオープン スペースができあがります。奇妙なことに、最初の偽のタップの後、問題を修正するために別のタップが表示されます。

これまでのところ、それを修正するハックを見つけましたが、満足していません。ビルトインがUILabel不透明でなく、選択直後に背景色がないことを確認することで機能します。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // hacky bugfix: when a row is reordered and then selected, the UILabel displays all crappy
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    for (UIView *view in cell.contentView.subviews) {
        if ([[view class] isSubclassOfClass:[UILabel class]]) {
            ((UILabel *) view).backgroundColor = nil;
            view.opaque = NO;
        }
    }

    // regular stuff: only flash the selection, don't leave it blue forever
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

これは機能しているように見えますが、それが永遠に良い考えであるとは思っていません。これを修正する正しい方法は何ですか?

4

4 に答える 4

6

これは、UITableView のレンダリングのバグのように見えます。レーダー バグ レポートを提出する必要があります。移動後、細胞がきちんとリフレッシュされていないようです。

今のところこれを回避する 1 つの方法は、組み込みのラベルを使用せず、セル内で独自のラベルを作成することです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

        CGRect frame = cell.contentView.bounds;
        frame.origin.x = frame.origin.x + 10.0f;

        UILabel *textLabel = [[UILabel alloc] initWithFrame:frame];
        [textLabel setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];
        textLabel.tag = 1;
        textLabel.textAlignment = UITextAlignmentLeft;
        textLabel.backgroundColor = [UIColor clearColor];
        textLabel.textColor = [UIColor blackColor];
        textLabel.font = [UIFont boldSystemFontOfSize:20.0];
        textLabel.numberOfLines = 1;
        textLabel.highlightedTextColor = [UIColor whiteColor];
        [cell.contentView addSubview:textLabel];
        [textLabel release];

    }

    UILabel *textLabel = (UILabel *)[cell viewWithTag:1];
    textLabel.text = @"Test";

    return cell;
}

これを試してみましたが、組み込みのラベルで見られるのと同じ種類の白い空白の長方形は表示されません。ただし、別の不透明でないビューをテーブル セルに追加すると、全体的なレンダリング パフォーマンスが最適になるとは限りません。

Apple は表の行に選択範囲の強調表示を保持することを望んでいないため、これがどの程度の不具合なのかはわかりません (最近、レビュープロセス中にこれを強制しています)。チェックマークを付けるか、選択してナビゲーション階層の次のレベルに移動する必要があります。その時点で、この白いボックスはほんの一瞬だけ画面に表示されます。

于 2009-02-26T01:27:30.657 に答える
1

情報をありがとう、UILabel から背景色を消去する方法を探していました。

次の行を使用しました。

textLabel.backgroundColor = [UIColor clearColor];

そして完璧に機能しました!!!

ありがとう

アレハンドラ:)

于 2009-06-16T22:44:52.370 に答える
-1

セレクションは長期間表示されることを意図していません! (私たちのアプリのいくつかでこれにぶつかりました)

??? つまり、Apple は iPhone で独自のカレンダー アプリを承認しないということです。イベントの開始時刻と終了時刻を編集しようとすると、開始時刻が無期限に選択され、ユーザーが次のフィールドをタップしたときにのみ変更されます。

于 2010-02-27T00:42:38.190 に答える