2014-12-29 2 views
0

У меня есть таблица из 100 строк и вы хотите прокручивать ее программно любому элементу и выбирать этот элемент. В первом контроллере я указываю строку и раздел и нажимаю контроллер с UITableView на стек навигации. В viewWillAppear из «Tableview-контроллер» Я использую код:UITableView не PROPERLY прокрутка вниз программно

[tableView_ selectRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:section] animated:NO scrollPosition:UITableViewScrollPositionMiddle]; 

Любопытно часть, она идеально прокручивает любому из 99 первых строк, получает выбран 100-й строки, но остается «ниже» видимой области , Мне нужно прокрутить таблицу вручную, чтобы открыть ее.

Если я поместил этот код в viewDidAppear, таблица прокручивает красиво, но после заметной задержки.

Что я и пытаюсь:

  1. Снижение высоты Tableview. Я получил tableView, который частично покрывает экран с последней строкой, скрытой действительно.
  2. Игра с contentSize - настройка его высоты на небольшие большие значения - не повезло.
  3. Установка contentInset.bottom - работал, но у меня есть бесполезное пространство внизу.
  4. В viewDidAppear, обработка 99 строк, как обычно, и установка пользовательских contentOffset для 100-й строки:

    offset.y += tableView_.contentSize.height - tableView_.bounds.size.height + 44; 
    

    работал тоже, но это, как представляется, некрасиво способом.

Итак, что я должен сделать, чтобы получить мой Tableview предварительно прокручиваются даже 100-го элемента, когда появляется «Tableview-контроллер»?

ОБНОВЛЕНИЕ. я не использую никаких xibs или раскадровки, только задающие взгляды в viewDidLoad:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    tableView_ = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStyleGrouped]; 
    tableView_.dataSource = self; 
    tableView_.delegate = self; 
    tableView_.sectionFooterHeight = 0.0f; 

    self.view = tableView_; 

    numbers = [NSMutableDictionary dictionary]; 
    numberSectionTitles = [NSMutableArray array]; 

    //... some model initialization 

    headerView = [[UIView alloc] initWithFrame:(CGRect){0, 0, 320, 60}]; 
    headerView.backgroundColor = [UIColor greenColor]; 

    UILabel *l = [[UILabel alloc] initWithFrame:(CGRect){20, 20, 280, 20}]; 
    l.textColor =[UIColor whiteColor]; 
    l.tag = 121; 

    [headerView addSubview:l]; 
} 

и настроить выбор в viewDidAppear (грязные обходные)

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    int row = _selectedIndex % 10; 
    int section = (_selectedIndex - row)/10; 

    if(row == 9 && section == 9){ 
    CGSize contentSize = tableView_.contentSize; 
    CGPoint offset = tableView_.contentOffset; 

    offset.y += tableView_.contentSize.height - tableView_.bounds.size.height + 44; 
    tableView_.contentOffset = offset; 
    } 
    [tableView_ selectRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:section] animated:NO scrollPosition:UITableViewScrollPositionMiddle]; 

} 

ответ

2

может быть ваша высота вид не совпадает из Tableview. ваш супервизор (на котором вы добавляете свой табличный вид) должен быть таким же. ваша последняя строка скрывается, потому что ваш вид не такой же высоты, как ваш tableview, возможно, это решит вашу проблему.

+0

Спасибо, полезное упоминание, но мой TableView представляет собой вид контроллера: 'tableView_ = [[UITableView Alloc] initWithFrame: self.view.bounds style: UITableViewStyleGrouped]; ' ' self.view = tableView_; ' –

+0

имеют подкласс под« UITableView »? или вы перетащили таблицу? пожалуйста, предоставьте больше информации, чтобы решить проблему. – Nitin

+0

ознакомьтесь с обновлением –

0

если (ячейки == ноль)

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

Наслаждайтесь кодирования

1

Вы можете сделать это вручную:

[_tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:section] animated:NO scrollPosition:UITableViewScrollPositionNone]; 

CGRect rect = [_tableView rectForRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:section]]; 

CGFloat offsetY = rect.origin.y+rect.size.height/2-_tableView.frame.size.height/2-_tableView.contentInset.top/2; 
if (offsetY < -_tableView.contentInset.top) 
    offsetY = -_tableView.contentInset.top; 
else if (offsetY > _tableView.contentSize.height-_tableView.frame.size.height) 
    offsetY = _tableView.contentSize.height-_tableView.frame.size.height; 

_tableView.contentOffset = CGPointMake(_tableView.contentOffset.x, offsetY); 
Смежные вопросы