Странная ошибка UIKit, строка представления таблицы остается выбранной - PullRequest
2 голосов
/ 12 апреля 2010

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

У меня довольно общая иерархия представлений:

UITabBarController -> UINavigationController -> UITableViewController

и контроллер табличного представления помещает другой контроллер табличного представления в стек контроллера навигации, когда выбрана строка. Здесь нет абсолютно ничего особенного или причудливого.

Однако второй UITableViewController, «контроллер детального просмотра», если хотите, выполняет две вещи:

  1. Он устанавливает hidesBottomBarWhenPushed в YES в своем методе init, поэтому панель вкладок скрыта при нажатии этого контроллера:

    - (id)initWithStyle:(UITableViewStyle)style {
        if(self = [super initWithStyle:style]) {
            self.hidesBottomBarWhenPushed = YES;
        }
        return self;
     }
    
  2. Он вызывает setToolbarHidden:NO animated:YES и setToolbarHidden:YES animated:YES для self.navigationController в viewWillAppear: и viewWillDisappear: соответственно, в результате чего UIToolbar, предоставленный UINavigationController, отображается и скрывается с анимацией:

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        [self.navigationController setToolbarHidden:NO animated:YES];
    }
    
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        [self.navigationController setToolbarHidden:YES animated:YES];
    }
    

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

Кроме того, строку нельзя отменить, вызвав deselectRowAtIndexPath:animated: на self.tableView в viewWillAppear: или viewDidAppear: в первом контроллере.

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

Мне не удалось найти что-либо об этом в Google или OpenRadar, и мне было интересно, если кто-то еще в SO имел эту проблему или знал решение / обходной путь.

Ответы [ 2 ]

1 голос
/ 12 апреля 2010

У меня была та же самая проблема, (хотя я не использую панель инструментов). Моим решением было отменить выбор строки в didSelectRowAtIndexPath после нажатия на мой второй контроллер представления.

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    RunViewController *runViewController = [[RunViewController alloc] initWithNibName:@"RunViewController" bundle:nil];
    runViewController.managedObjectContext = self.managedObjectContext;
    runViewController.hidesBottomBarWhenPushed = YES;
    [self.navigationController pushViewController:runViewController animated:YES];
    [runViewController release];

     //deslect "stuck" row
    [aTableView deselectRowAtIndexPath:indexPath animated:YES]; 
}
0 голосов
/ 12 апреля 2010

Если я хорошо помню, я думаю, что однажды у меня была такая же / похожая проблема, но мое решение было довольно грубым:

- (UITableViewCell*)tableView:(UITableView*)tableView 
        cellForRowAtIndexPath:(NSIndexPath*)indexPath {
  // ...
  cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...