2013-04-02 3 views
1

У меня есть UITableView, в котором есть ячейки с изображениями, текстом и кнопкой раскрытия. Я загружаю клетки, как это:UITableViewCellAccessoryDetailDisclosureButton исчезает после замены UITableViewCell аксессуар

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if(!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; 
    } 

    if ([indexPath row] == [[self multas] count]) { 
     [[cell textLabel] setText:@"Carregar mais..."]; 
    } 
    else 
    { 
     Multa *multa = [self.multas objectAtIndex:indexPath.row]; 

     NSString *dataIsolada = [[NSString stringWithFormat:[multa dataOcorrencia]] substringWithRange:NSMakeRange(0, 10)]; 

     [[cell textLabel] setText:[NSString stringWithFormat:dataIsolada]]; 
     [[cell detailTextLabel] setText:[multa descricao]]; 
     [cell.imageView setImageWithURL:[NSURL URLWithString:[multa fotoURL]] 
         placeholderImage:[UIImage imageNamed:@"carregando.jpeg"]]; 
     [cell.imageView setContentMode: UIViewContentModeScaleAspectFit]; 
     [cell setAccessoryType:UITableViewCellAccessoryDetailDisclosureButton]; 
    } 

    return cell; 
} 

Когда пользователь нажимает на кнопку раскрытия, я включаю кнопку раскрытия для индикатора активности и затем нажмите другой вид экрана с помощью навигационного контроллера:

- (void)carregarDetalhesMulta:(UITableView *)tableView comMulta:(Multa *)multa 
{ 
    DetalheMultaViewController *form = [[DetalheMultaViewController alloc] initWithMulta:multa]; 
    form.delegate = self; 

    UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:form]; 

    [self presentModalViewController:navigation animated:YES]; 
} 

- (void) tableView: (UITableView *) tableView accessoryButtonTappedForRowWithIndexPath: (NSIndexPath *) indexPath 
{ 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleGray]; 
    spinner.frame = CGRectMake(0, 0, 24, 24); 
    cell.accessoryView = spinner; 
    [spinner startAnimating]; 

    Multa *multa = [self.multas objectAtIndex:indexPath.row]; 

    double delayInSeconds = 0.1; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 

    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 

     [spinner stopAnimating]; 
     [self carregarDetalhesMulta:tableView comMulta:multa]; 
     [cell setAccessoryType:UITableViewCellAccessoryDetailDisclosureButton]; 
    }); 

} 

Обратите внимание, что в конце я изменил аксессуар для кнопки раскрытия. Проблема заключается в следующем: когда я вернусь (нажав кнопку назад) на представление, содержащее UITableView, строка, которую я нажал, не показывает кнопку раскрытия информации и индикатор активности. Что я делаю неправильно? Какой лучший способ переключить эти элементы управления, не перезагружая представление таблицы?

+1

make cell.accessoryView = NULL; а затем используйте свой код. –

ответ

2

свойство accessoryView имеет приоритет над accessoryType собственности. Если вы установите accessoryView на номер nil, вы снова увидите кнопку аксессуара.

+0

спасибо. – gabsferreira

0

Вот что я понял из вопроса: вы хотели бы, чтобы аксессуар выглядел кнопкой раскрытия информации, которая при нажатии на нее становится индикатором активности. После небольшой задержки вы хотите нажать на новый контроллер представления.

Вот как я бы это сделать:

  1. установка ячейки прототип в раскадровке не иметь аксессуаров: нет.
  2. добавить нажимной SEGUE из контроллера представления в ОЕ назначении вы хотите, дайте ему идентификатор, скажут @ «MyPushSegue»

Добавить в accessoryView к клеткам (если они не один) в cellForRowAtIndexPath :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 
    // the rest of your cellForRowAtIndexPath 

    if (!cell.accessoryView) 
     cell.accessoryView = [self createAccessoryView]; 

    return cell; 
} 

Создать аксессуар представление таким образом (предполагается, АРК):

- (UIView *)createAccessoryView { 

    UIView *accessoryView = [[UIView alloc] initWithFrame:CGRectZero]; 
    UIButton *disclosureButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 

    disclosureButton.tag = 100; 
    [disclosureButton addTarget:self action:@selector(pressedAccessory:) forControlEvents:UIControlEventTouchUpInside]; 

    UIActivityIndicatorView *aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
    aiv.tag = 101; 
    aiv.alpha = 0.0; 
    aiv.center = disclosureButton.center; 

    accessoryView.bounds = disclosureButton.bounds; 
    [accessoryView addSubview:aiv]; 
    [accessoryView addSubview:disclosureButton]; 
    return accessoryView; 
} 

кнопка раскрытия в вышеуказанном вызывает метод, когда, но тонна нажата. Этот метод должен изменить состояние представления селектора и вызвать толчок Segue вам настройки в раскадровке:

- (void)pressedAccessory:(UIButton *)sender { 

    UIView *accessoryView = sender.superview; 
    [self setAccessoryView:accessoryView waiting:YES]; 

    // let the user see the spinner for 1 seconds 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void) { 
     [self performSegueWithIdentifier:@"MyPushSegue" sender:self]; 
     [self setAccessoryView:accessoryView waiting:NO]; 
    }); 
} 

Наконец, чтобы решить эту проблему, вы имеете, мы не заменить вид аксессуара с блесной, мы изменить, как она выглядит на скрытие/отображение кнопки и скрытие/показ вертушку, в зависимости от того, в каком состоянии мы хотим:

- (void)setAccessoryView:(UIView *)accessoryView waiting:(BOOL)waiting { 

    UIButton *disclosureButton = (UIButton *)[accessoryView viewWithTag:100]; 
    UIActivityIndicatorView *aiv = (UIActivityIndicatorView *)[accessoryView viewWithTag:101]; 
    [UIView animateWithDuration:0.1 animations:^{ 
     disclosureButton.alpha = (waiting)? 0.0 : 1.0; 
     aiv.alpha = (waiting)? 1.0 : 0.0; 
    }]; 

    if (waiting) [aiv startAnimating]; else [aiv stopAnimating]; 
} 
+0

Возможно, я сделаю так, что достиг бы того, что мне нужно, но на данный момент ответ Скотта решает мою проблему. Я попробую этот подход позже, когда я не спешу. Спасибо. – gabsferreira

Смежные вопросы