Пользовательский элемент управления в ячейке прототипа UITableView, при изменении значения в элементе управления сегментом прокрутка перемещается в верхний стек

#ios #objective-c #xcode #uitableview

#iOS #objective-c #xcode #uitableview

Вопрос:

У меня есть экран, на котором мы показываем вопросы с ДА или НЕТ. Для да или нет мы использовали элемент управления UISegment. При изменении значения в элементе управления пользовательским сегментом прокрутка перемещается в верхнюю часть экрана, когда у нас появляется больше вопросов и когда мы выбираем последний или но последний, как показано на рисунке.

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

Ссылка на видео, как выглядит результат https://imgur.com/nvn1Exw .

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

 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return timeOutQuestions.count;
}

- (UITableViewCell* )tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{
    static NSString* questionTableIdentifier=@"SegmentCell";
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: questionTableIdentifier];
    
    if(cell == nil){
        cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:questionTableIdentifier];
         cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
         cell.textLabel.numberOfLines = 0;
      }
    
    cell.separatorInset = UIEdgeInsetsMake(0.0 , cell.bounds.size.width , 0.0, -cell.bounds.size.width);
       
    Question* currentQuestion=[[shared getQuestions:questionSet] objectAtIndex:indexPath.row];
    @try{
        UISegmentedControl *segment = [[cell.contentView subviews] objectAtIndex:0];
        segment.selectedSegmentIndex = [[questionSegmentControl objectAtIndex:indexPath.row] integerValue];
        [segment addTarget:self action:@selector(segmentSwitch:) forControlEvents:UIControlEventValueChanged];
        
        UILabel *label = [[cell.contentView subviews] objectAtIndex:1];
        label.text = currentQuestion.questionText;
        label.numberOfLines = 0;
        label.lineBreakMode = NSLineBreakByWordWrapping;
        
        [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    }@catch(NSException* ex){
        NSLog(@"%@",ex.reason);
    }
    
    if(changeOffSet amp;amp; indexChangedValue.row > 2){
        [self.questionTableView setContentOffset:tableContentOffSet animated:NO];
         [UIView setAnimationsEnabled:true];
        changeOffSet = false;
    }
    
    return cell;
}

- (IBAction)segmentSwitch:(UISegmentedControl *)sender {
    NSInteger selectedSegment = sender.selectedSegmentIndex;
    CGPoint senderOriginInTableView = [questionTableView convertPoint:CGPointZero fromView:sender];
    NSIndexPath *indexPath = [questionTableView indexPathForRowAtPoint:senderOriginInTableView];
    indexChangedValue = indexPath;
    tableContentOffSet = self.questionTableView.contentOffset;
    [UIView setAnimationsEnabled:false];
    changeOffSet = true;
}
  

https://imgur.com/nvn1Exw

Ответ №1:

Я думаю, что вы выполняете прокрутку программно с помощью этого

 [self.questionTableView setContentOffset:tableContentOffSet animated:NO];
  

Я думаю, вам нужно его немного переработать. Прекратите изменять смещение содержимого и посмотрите, как это происходит. Кроме того, возможно, вам нужно избавиться от этой строки

 [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
  

что, я думаю, также мешает прокрутке.