2

iOS6 ではこの問題は発生しませんでしたが、現在 iOS7 で問題が発生しています。UITableView があり、ビューが読み込まれた時点で 8 つのセルが表示されます。それぞれに と 配列から異なる名前が取り込まれます。下にスクロールすると、次の 2 つのセルはきれいに見えますが、それ以降のすべてのセルはその上にテキストが配置されます。そのテキストは、前のセルにあったものの内容です。したがって、10 番目のセルには、最初のセルにあったものと、10 番目のセルにあるはずのものがその上に置かれます。

コード:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

        if (cell == nil) 
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }

        //Create Label for Name inside cell
        UILabel *name = [[UILabel alloc] initWithFrame:CGRectMake( 7.0, 5.0, 300.0, 30.0 )];
        [name setText:[self.entriesArray objectAtIndex:indexPath.row]];


        //Check to see if current person is a Parent or Child
        NSString *class = [self.database getCellDataWithMembership:[self.MembershipArray objectAtIndex:indexPath.row] andColIndex:4];

        if([class isEqualToString:@"CHILD"])
        {
            name.textColor = [UIColor colorWithRed:25.0f/255.0f green:111.0f/255.0f blue:45.0f/255.0f alpha:1.0f];
            name.font = [UIFont fontWithName:@"Helvetica-Bold" size:17.0];                
        }

        [cell.contentView addSubview:name];
        return cell;
}

テーブルビューに関する私のスキルはせいぜいその場しのぎです。多くのドキュメントを読み、解決策を調査してきましたが、解決策を思いつくことができませんでした。iOS6 では完璧に動作するのに、iOS7 ではうまく動作しないのは奇妙だと思います。

したがって、配列から人の名前を取得し、セルにそれらの名前を入力したいと思います。私はもともとこれを使用してこれを達成することができました:

cell.textLabel.text = [self.entriesArray objectAtIndex:indexPath.row];

if([class isEqualToString:@"CHILD"])
{
    cell.textLabel.textColor = [UIColor colorWithRed:25.0f/255.0f green:111.0f/255.0f blue:45.0f/255.0f alpha:1.0f];
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:17.0];

最初のコード ブロックの「name」UILabel アクションの代わりにそれを使用すると、名前はテキスト オーバーレイなしで完全に表示されますが、問題になるのはテキストの色です。子としてラベル付けされている場合は、緑色のテキストで太字にする必要があります。ただし、下にスクロールした後、すべての人が緑色になるべきではないときに緑色になります。

長い質問で申し訳ありません。私はこれに取り組んでいて、頭を悩ませていますが、理解できないようです。どんな助けでも大歓迎です。

4

5 に答える 5

1

UI オブジェクトをセルに動的に追加しています。「caglar」が指摘しているように、追加してから削除することは、ベストプラクティスではない可能性があります。でも、これもやっています。セルが表示されるたびに、大量の UI オブジェクトをセルに追加することを回避する方法は、最初にすべてのサブビューを削除することです。その後、willDisplayCell デリゲートがそれらを追加し直します。明らかに、特定のビューのみを削除したい場合は、ビューにタグを付けて、より選択的に削除する必要があります。ただし、次の方法ですべてを削除できます。

-(void)tableView:(UITableView *)tableView
 willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath {

    [[cell.contentView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
}

セルの contentView にラベルを追加/削除していることを確認してください。iOS7 では、注意しないと、これも削除されます。

それがあなたを助けることを願っています。

于 2013-10-21T08:00:20.493 に答える
0

cellForRowAtIndexPath:コードでは、メソッドが呼び出されるたびにラベルがセルに追加されます。つまり、ラベルを何度も追加します。以前に追加されたラベルを削除できます。

//If label was added with tag = 500, remove it
for (UIView *sv in cell.contentView.subviews)
{
    if (sv.tag == 500)
    {
        [sv removeFromSuperview];
    }
}

//Create Label for Name inside cell
UILabel *name = [[UILabel alloc] initWithFrame:CGRectMake( 7.0, 5.0, 300.0, 30.0 )];
[name setText:[self.entriesArray objectAtIndex:indexPath.row]];
name.tag = 500;

ただし、このソリューションは適切なソリューションではありません。カスタムを作成することUITableViewCellは正しいことだと思います。

于 2013-09-27T19:58:57.713 に答える
0

このメソッドを試すことがcellできます.nilUILabel* namenamename.tag = 1000UILabel* name = (UILabel*)[cell.contentView viewWithTag:1000];

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    if (cell == nil) 
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        //Create Label for Name inside cell
        UILabel *name = [[UILabel alloc] initWithFrame:CGRectMake( 7.0, 5.0, 300.0, 30.0 )];
        name.tag = 1000;
        [cell.contentView addSubview:name];
    }

    UILabel* name = (UILabel*)[cell.contentView viewWithTag:1000];
    [name setText:[self.entriesArray objectAtIndex:indexPath.row]];


    //Check to see if current person is a Parent or Child
    NSString *class = [self.database getCellDataWithMembership:[self.MembershipArray objectAtIndex:indexPath.row] andColIndex:4];

    if([class isEqualToString:@"CHILD"])
    {
        name.textColor = [UIColor colorWithRed:25.0f/255.0f green:111.0f/255.0f blue:45.0f/255.0f alpha:1.0f];
        name.font = [UIFont fontWithName:@"Helvetica-Bold" size:17.0];                
    }

    return cell;

}

于 2013-12-18T03:50:02.033 に答える
-1

表示されている ios6/7 デルタを使用して uilabels を設定できます。サイズ インスペクタです。まず、値 x、y、幅、高さを変更して ios7 の合計ビューを設定し、次に ios6/7 デルタの値を変更して ios6 用にします。

于 2013-09-27T06:10:59.687 に答える
-2

このコードは変更できます。

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; -> UITableViewCell *cell = nil;
于 2013-09-27T06:57:25.767 に答える