2

UITableViewとメソッドreloadDataに問題があります。

データベース内の最後の情報が降順で表示されている更新ボタンをクリックすると、tableViewが更新されるため、最新のアイテムが最初の位置に表示されます。

テーブルビューのすべてのセルは、カスタムラベルとuiimageviewsで埋められています。

さて...その更新ボタンを押して新しいデータが見つかった場合、最初の5行(ディスプレイに表示されている行)は更新されませんが、次の行は更新されます。ただし、最初の5行のいずれかを押すと、新しいデータを使用してtableView:didSelectRowAtIndexPath:メソッドが正しく呼び出されます。

したがって、問題は、最初の5行のテーブルビューの「ビジュアル」コンテンツが更新されていないことです。

誰でもこれを手伝ってくれますか?

ありがとう!

コード:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *CellIdentifier = [ NSString stringWithFormat: @"%d:%d", [ indexPath indexAtPosition: 0 ], [ indexPath indexAtPosition:1 ]];

    UITableViewCell *cell = [ tableView dequeueReusableCellWithIdentifier: CellIdentifier];

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

        // Configure the cell...
        cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
        Activity *activity = [[self.activities valueForKey:[[[self.activities allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];
        cell.textLabel.text=@"";
        //Mostramos el nombre
        UILabel *label= [[UILabel alloc] initWithFrame:CGRectMake(60, -5, 200, 34)];
        label.text = [activity name];
        label.font = [UIFont boldSystemFontOfSize:17];
        label.backgroundColor = [UIColor clearColor];
        [cell addSubview:label];
        [label release];

        //Mostramos la imagen
        UIImageView *leftImage = [[UIImageView alloc] initWithFrame:CGRectMake(5, 3, 50, 50)];
        [cell addSubview:leftImage];


        UITextView *textView=[[UITextView alloc] initWithFrame:CGRectMake(60, 25, 200, 38)];
        textView.editable = NO;
        textView.backgroundColor = [UIColor clearColor];
        textView.textColor = [UIColor grayColor];
        textView.font = [UIFont systemFontOfSize:12.0];
        textView.contentInset = UIEdgeInsetsMake(-8,-8,0,0);
        textView.userInteractionEnabled=NO;
        [cell addSubview:textView];

        switch ([activity notType]) {
            case 0:
                textView.text = [NSString stringWithFormat:NSLocalizedString(@"requestPUSH",@""),[activity name]];
                leftImage.image = [UIImage imageNamed:@"ios.png"];
                break;
            case 1:
                textView.text = [NSString stringWithFormat:NSLocalizedString(@"MPCreatedPushString",@""),[activity name],[activity nameItem]];
                leftImage.image = [UIImage imageNamed:@"mpNew.png"];
                break;
            case 2:
                textView.text = [NSString stringWithFormat:NSLocalizedString(@"MPUpdatedPushString",@""),[activity name],[activity nameItem]];
                leftImage.image = [UIImage imageNamed:@"mpUpdated.png"];
                break;
            case 3:
                textView.text = [NSString stringWithFormat:NSLocalizedString(@"MPDeletedPushString",@""),[activity name],[activity nameItem]];
                leftImage.image = [UIImage imageNamed:@"ios.png"];
                break;
            case 4:
                textView.text = [NSString stringWithFormat:NSLocalizedString(@"MPGuestConfirmationPUSHString",@""),[activity name],[activity nameItem]];
                leftImage.image = [UIImage imageNamed:@"attend.png"];
                break;
            case 5:
                if ([[activity message] isEqualToString:@"noData"]) {
                    textView.text = [NSString stringWithFormat:NSLocalizedString(@"ShoutPushString",@""),[activity name]];
                }else{
                    textView.text = [NSString stringWithFormat:NSLocalizedString(@"ShoutPushStringWithData",@""),[activity name], [activity message]];
                }
                UIImage *contactImage = [UIImage imageWithData:[[activity person] pic]];
                if (contactImage!=nil) {
                    leftImage.image = contactImage;
                    //redondeamos bordes
                    CALayer * l = [leftImage layer];
                    [l setMasksToBounds:YES];
                    [l setCornerRadius:5.0];
                }else{
                    leftImage.image = [UIImage imageNamed:@"ios.png"];
                }
                break;
            case 6:
                textView.text = [NSString stringWithFormat:NSLocalizedString(@"CheckinPushString",@""),[activity name],[activity nameItem]];
                leftImage.image = [UIImage imageNamed:@"ios.png"];
                break;
            case 7:
                textView.text = [NSString stringWithFormat:NSLocalizedString(@"MPGuestRejectionPUSHString",@""),[activity name],[activity nameItem]];
                leftImage.image = [UIImage imageNamed:@"reject.png"];
                break;
            default:
                break;
        }
        [leftImage release];
        [textView release];


        //Mostrar fecha
        double timestamp = [[activity datetime] doubleValue]/1000;
        NSString *dateShow;

        NSDate *datetime = [NSDate dateWithTimeIntervalSince1970:timestamp];
        NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
        [dateFormat setDateFormat:@"HH:mm"];
        dateShow=[dateFormat stringFromDate:datetime];

        UILabel *label2= [[UILabel alloc] initWithFrame:CGRectMake(240, 0, 70, 20)];
        label2.text = dateShow;
        label2.textAlignment = UITextAlignmentRight;
        label2.font = [UIFont systemFontOfSize:12];
        label2.backgroundColor = [UIColor clearColor];
        label2.textColor = [UIColor blueColor];
        [cell addSubview:label2];
        [label2 release];

    }

    return cell;
}
4

1 に答える 1

1

うーん、各セルに一意のセル識別子を付けます。その理由はありますか?ほとんどの人は、iOSテーブルビューの誤解をそのように修正しようとします...

テーブルをリロードすると、この呼び出しUITableViewCell *cell = [ tableView dequeueReusableCellWithIdentifier: CellIdentifier]; によってセルが再利用されます(読み取りにはすでにコンテンツが含まれています)。

しかし、あなたのコードは「新鮮な」セルに対してのみ機能します:if (cell == nil) { 、あなたはその場合の準備ができていません...

于 2012-01-22T17:17:31.343 に答える