UITableView перезагрузка данных / обновление (возможная проблема дублирования) - PullRequest
1 голос
/ 05 января 2010

У меня есть UITableView в приложении для iPhone, которое я обновляю (вызывая [self.tableView reloadData] в методе действия для UISegmentedControl, динамически встроенного в одну из ячеек UITableView. Представление таблицы обновляется для обновления текста значение для одной из ячеек.

Однако следующий код, по-видимому, вызывает нежелательный побочный эффект. Похоже, что каждый раз, когда обновляется UITableView, он создает новый экземпляр UISegmentedControl (и, возможно, изображения - я не уверен) поверх существующего (ых).

Единственная причина, по которой я замечаю это, заключается в том, что с каждым обновлением вокруг UISegmentedControl начинает формироваться едва заметная граница, и приложение заметно замедляется. Я был бы чрезвычайно благодарен за любые предложения / кодовые решения для моего текущего затруднительного положения.

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }

    NSUInteger section = indexPath.section;
    NSUInteger row = indexPath.row;

    // Set up the cell...       


    //populates the personal info section
    if (section == kPersonalInfoAddSection) {

        if (row == kNameRow) {

                    //Other code irrelevant to this question was removed for the sake of clarity
        }
        else if(row == kHeightRow) {

            cell.imageView.image = [UIImage imageNamed:@"tableview_height_label.png"];
                    //THIS IS THE TEXT I'M TRYING TO UPDATE
            cell.textLabel.text = [Formatter formatHeightValue:mainUser.heightInMM forZone:self.heightZone];
            cell.detailTextLabel.text = REQUIRED_STRING;

        }
    }

    //populates the units section
    if (section == kUnitsSection) {

        if (row == kHeightUnitsRow) {
            NSArray *heightUnitsSegments = [[NSArray alloc] initWithObjects:FT_AND_IN_STRING, M_AND_CM_STRING, nil];

            UISegmentedControl *heightUnitControl = [[UISegmentedControl alloc] initWithItems:heightUnitsSegments];

            CGRect segmentRect = CGRectMake(90, 7, 200, 30);
            [heightUnitControl setFrame:segmentRect];
            //[heightUnitControl setSelectedSegmentIndex:0];
            [heightUnitControl addTarget:self action:@selector(heightSegmentClicked:) forControlEvents:UIControlEventValueChanged];
            heightUnitControl.tag = kHeightSegmentedControlTag;

            cell.textLabel.text = @"Height:";
            cell.detailTextLabel.text = @"(units)";
            [cell.contentView addSubview:heightUnitControl];

            [heightUnitsSegments release];
            [heightUnitControl release];

        }
        else if(row == kWeightUnitsRow) {

                    //Other code irrelevant to this question was removed for the sake of clarity    

        }
    }

    return cell;
}

Спасибо всем заранее!

Ответы [ 2 ]

2 голосов
/ 05 января 2010

Вы правы, он создает новый экземпляр UISegmentedControl. Это потому, что вы используете общий идентификатор ячейки, @ "Cell", затем каждый раз добавляете UISegmentedControl, никогда не удаляя его. Ячейки кэшируются, содержащие UISegmentedControl, вы извлекаете ячейку из кэша и снова добавляете элемент управления.

Вы можете использовать более конкретный идентификатор ячейки, и если ячейка! = Ноль, вы знаете, что она уже содержит UISegmentedControl. Или создайте новую ячейку каждый раз, когда вы не используете кэшированную ячейку, которая уже содержит элемент управления.

При просмотре изображения вы просто устанавливаете свойство представления изображения ячеек, не добавляя новое представление в ячейку, чтобы оно было в порядке, оно будет заменяться каждый раз.

Поскольку текст, который вы пытаетесь обновить, не имеет отношения к UISegmentedControl, я думаю, вы должны иметь возможность использовать более конкретный идентификатор ячейки и добавлять элемент управления только при создании ячейки.

0 голосов
/ 05 января 2010
- (void)viewDidLoad {
    [super viewDidLoad];
    NSArray *arr1=[NSArray arrayWithObjects:@"img1.jpg",@"img2.jpg",nil];
    NSArray *arr2=[NSArray arrayWithObjects:@"img1.jpg",@"img2.jpg",@"img3.jpg",@"img4.jpg",@"img5.jpg",@"img6.jpg",nil];
    NSArray *arr3=[NSArray arrayWithObjects:@"img6.jpg",@"img5.jpg",@"img2.jpg",@"img1.jpg",nil];

    Imgs = [[NSArray alloc] initWithArray:[NSArray arrayWithObjects:arr1,arr2,arr3,nil]];


    NSDictionary *dic1=[NSDictionary dictionaryWithObjectsAndKeys:@"Ahmedabad",@"Name",@"Picture 5.png",@"Rating",@"Picture 1.png",@"Photo",arr1,@"img",nil];
    NSDictionary *dic2=[NSDictionary dictionaryWithObjectsAndKeys:@"Rajkot",@"Name",@"Picture 5.png",@"Rating",@"Picture 2.png",@"Photo",nil];
    NSDictionary *dic3=[NSDictionary dictionaryWithObjectsAndKeys:@"Baroda",@"Name",@"Picture 5.png",@"Rating",@"Picture 7.png",@"Photo",nil];

    tblArray=[[NSArray alloc] initWithObjects:dic1,dic2,dic3,nil];
    [myTbl reloadData];

}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.navigationController.navigationBarHidden=NO;
    [self.navigationController.navigationBar setUserInteractionEnabled:YES];

}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.navigationController.navigationBarHidden=YES;
}



-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [tblArray count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    NSString *CellIdentifer=[NSString stringWithFormat:@"%i",indexPath.row];
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifer];
    if(cell==nil){
        cell=[self myCustomCell:CellIdentifer dicToSet:[tblArray objectAtIndex:indexPath.row]];
        [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
    }
    return cell;
}

-(UITableViewCell*)myCustomCell:(NSString*)CellIdentifer dicToSet:(NSDictionary*)dicToSet{
    UITableViewCell *cell=[[[UITableViewCell alloc] initWithFrame:CGRectMake(0, 0, 320, 44) reuseIdentifier:CellIdentifer] autorelease];

    UIImageView *imgV=[[UIImageView alloc] initWithFrame:CGRectMake(2, 2, 40, 40)];
    [imgV setImage:[UIImage imageNamed:[dicToSet valueForKey:@"Photo"]]];
    [cell addSubview:imgV];
    [imgV release];

    UILabel *lbl=[[UILabel alloc] initWithFrame:CGRectMake(44, 2, 276, 20)];
    [lbl setText:[dicToSet valueForKey:@"Name"]];
    [cell addSubview:lbl];
    [lbl setBackgroundColor:[UIColor clearColor]];
    [lbl setFont:[UIFont fontWithName:@"Helvetica-Bold" size:18]];
    [lbl release];


    UIImageView *imgV1=[[UIImageView alloc] initWithFrame:CGRectMake(44, 24, 70, 20)];
    [imgV1 setImage:[UIImage imageNamed:[dicToSet valueForKey:@"Rating"]]];
    [cell addSubview:imgV1];
    [imgV1 release];


    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    nxtPlcDtl=[[plcFullDtl alloc] initWithNibName:@"plcFullDtl" bundle:nil];
    nxtPlcDtl.dict=[[NSDictionary alloc] initWithDictionary:[tblArray objectAtIndex:indexPath.row]];
    nxtPlcDtl.Imgs = [Imgs objectAtIndex:indexPath.row];
    nxtPlcDtl.comment1 = [comment1 objectAtIndex:indexPath.row];
    nxtPlcDtl.vedio = [vedio objectAtIndex:indexPath.row];

    [self.navigationController pushViewController:nxtPlcDtl animated:YES];



    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...