2016-02-09 3 views
0

Я называю didSelectRowAtIndexPath: как и в viewDidAppear`didDeselectRowAtIndexPath:` не вызывается после вызова `didSelectRowAtIndexPath:`

-(void)viewDidAppear:(BOOL)animated { 

    [self tableView:self.tableView didSelectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; 

} 

Это didSelectRow

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

    UITableViewCell *cell = (UITableViewCell*)[tableView cellForRowAtIndexPath:indexPath]; 
    [UIView animateWithDuration:0.4 animations:^{ 

     cell.contentView.backgroundColor = [UIColor blackColor]; 
     cell.textLabel.textColor = [UIColor whiteColor]; 
    }]; 
    [UIView animateWithDuration:0.4 animations:^{ 
     UITableViewCell *cell = (UITableViewCell*)[tableView cellForRowAtIndexPath:indexPath]; 
     cell.contentView.backgroundColor = [UIColor blackColor]; 
     cell.textLabel.textColor = [UIColor whiteColor]; 
     cell.textLabel.transform = CGAffineTransformMakeScale(1.1f, 1.1f); 
    } completion:^(BOOL finished) { 
     [UIView animateWithDuration:0.4 animations:^{ 
      cell.textLabel.transform = CGAffineTransformIdentity; 
     }]; 

    }]; 
} 

Он работает нормально, но когда я выбираю новая ячейка, первая ячейка, выбранная в вызове viewDidAppear на didSelectRow, не вызывает didDeselectRowAtIndexPath:, она остается черной, а анимация ниже не выполняется, когда выбрана новая ячейка. Проблема заключается в том, что первая ячейка, выбранная в вызове viewDidAppear, остается выбранной до ее повторного выбора. Кажется, проблема в том, что indexPath не передается без прикосновения.

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

    UITableViewCell *cell = (UITableViewCell*)[tableView cellForRowAtIndexPath:indexPath]; 

    [UIView animateWithDuration:0.4 animations:^{ 

     cell.contentView.backgroundColor = [UIColor whiteColor]; 
     cell.textLabel.textColor = [UIColor blackColor]; 
    }]; 
} 
+0

я поставил его в 'viewDidLoad' должен быть хорошо – noobsmcgoobs

ответ

0

я думаю, что и нужно сказать TableView, что и выбирают ячейку, в первый раз после того, что он пришел, чтобы знать, что есть клетка выбрана, для этого и нужно сделать что-то вроде ниже,

- (void)viewDidAppear:(BOOL)animated 
    { 
    [super viewDidAppear:animated]; 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
    UITableViewCell *cell = [self.myTableView cellForRowAtIndexPath:indexPath]; 
    if(cell) 
    { 
     //tell the tableview that first cell is selected so that deselct method is called after selecting the otehr cell 
     [self.myTableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; 
     [self performSelectionAnimationFor:cell]; //perfor your selection animation 
    } 
    } 

В приведенном выше примере мы просто выбираем ячейку, и после этого мы выполняем анимационную часть вашего кода (см. Комментарий).

для простоты я отделил код анимации, как показано ниже,

- (void)performSelectionAnimationFor:(UITableViewCell *)cell 
{ 
    [UIView animateWithDuration:0.4 animations:^{ 

     cell.contentView.backgroundColor = [UIColor blackColor]; 
     cell.textLabel.textColor = [UIColor whiteColor]; 
    }]; 

    [UIView animateWithDuration:0.4 animations:^{ 
     //UITableViewCell *cell = (UITableViewCell*)[self.myTableView cellForRowAtIndexPath:indexPath]; 
     cell.contentView.backgroundColor = [UIColor blackColor]; 
     cell.textLabel.textColor = [UIColor whiteColor]; 
     cell.textLabel.transform = CGAffineTransformMakeScale(1.1f, 1.1f); 
    } completion:^(BOOL finished) { 
     [UIView animateWithDuration:0.4 animations:^{ 
      cell.textLabel.transform = CGAffineTransformIdentity; 
     }]; 
    }]; 
} 

и отмену анимацию, как показано ниже,

- (void)performDeselectionAnimationFor:(UITableViewCell *)cell 
{ 
    [UIView animateWithDuration:0.4 animations:^{ 
     cell.contentView.backgroundColor = [UIColor whiteColor]; 
     cell.textLabel.textColor = [UIColor blackColor]; 
    }]; 

} 

вы можете CELL этого метода из Tableview метода делегата, как показано ниже,

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = (UITableViewCell*)[tableView cellForRowAtIndexPath:indexPath]; 
    [self performSelectionAnimationFor:cell]; 
} 

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = (UITableViewCell*)[tableView cellForRowAtIndexPath:indexPath]; 
    [self performDeselectionAnimationFor:cell]; 
} 

, а также u уже настроили стиль выбора ячейки на UITableViewCellSelectionStyleNone

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

    //...cell creation 
    //set this if u are not 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    return cell; 
} 
+0

Я попробую, он хорошо выглядит – noobsmcgoobs

+0

Спасибо, проблема была в том, что вы сказали, ячейка не была выбрана, даже если вызывается 'didSelect'. Мой код немного отличается тем, что мне пришлось вручную вызывать 'didSelect' после' selectRowAtIndexPath' вместо просто анимации. Это не то, что я ожидал, что проблема была - я подумал, что, возможно, где-то где-то терялась переменная ссылка, и поэтому 'didSelect' не получал правильный indexPath. Оно работает. – noobsmcgoobs

+0

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

0

Метод didSelectRowAtIndexPath является UITableViewDelegate методом. Вы не должны называть это, система называет его на основе действий пользователя.

Если вы хотите, чтобы выбрать вид таблицы строку, которую следует вызвать представление табличного selectRowAtIndexPath метода вместо:

[self.tableView selectRowAtIndexPath: [NSIndexPath indexPathForRow:0 inSection:0]]; 

Если вы сделаете это представление таблицы будет правильно выбрать строку.

+0

не работает, потому что он не называет' didSelectRow' – noobsmcgoobs

0

Вы проверили параметр «Выбор» в инспекторе атрибутов UITableView? Это один выбор или несколько?

Проблема связана с множественной селекции Проблема связана с множественной селекции

или вы можете использовать в ViewWillApear вместо didSelectRow, потому что это не правильный путь, чтобы выбрать строку в UITableView

[tableView selectRowAtIndexPath:indexPath 
         animated:NO 
       scrollPosition:UITableViewScrollPositionMiddle]; 
+0

одиночного выбора. – noobsmcgoobs

+0

Используйте selectRowAtIndexPath вместо didSelectRow –

+0

Да, это не дает эффекта, который мне нужен, потому что он не вызывает 'didSelectRow', анимация не вызывается, и ячейка просто кажется серым. Да, технически ячейка выбирается. – noobsmcgoobs

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