2014-03-10 3 views
5

Я просто обновил iOS 7.1, и я получил нераспознанную ошибку выбора для функции под названием «_layoutCells».iOS: больше сбоев табуляции в моем подклассе UITabBarController на iOS 7.1

У меня есть простой подкласс UITabBarController.

+0

Такая же проблема здесь. Я не могу найти ошибку. Это на нашей стороне или на Яблоки? – CGee

+0

Я опубликовал сообщение об ошибке в этой проблеме с Apple. Идентификатор проблемы 16299264. – CGee

ответ

4

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

Просто добавьте следующий метод вашей реализации подкласса UITabBarController:

- (void) _layoutCells 
{ 
    // HACK ALERT: on iOS 7.1, this method will be called from deep within the bowels of iOS. The problem is that 
    // the method is not implemented and it results in an unrecognized selected crash. So we implement it... 
    // 
    // What could go wrong? 
} 
+1

Я не думаю, что это хорошая идея - даже в качестве обходного решения. Единственный случай, когда он должен использоваться, находится в разработке (для проверки других представлений, которые невозможно получить из-за этой ошибки). Но приложения не должны публиковаться с этим обходным путем, поскольку этот метод переопределяет поведение '_layoutCells', что может тормозить ожидаемое поведение iOS. На мой взгляд, лучше просто позволить Apple исправить это. Я опубликовал сообщение об ошибке об ошибке: Идентификатор проблемы 16299264. – CGee

+1

Я борюсь с той же ошибкой. Моя проблема заключается в том, что я предоставляю свой собственный источник данных и делегировать для большего табуляции табуляции. Этот метод вызывается с классом делегата. Делитесь, когда Apple полагается. –

+0

Такая же проблема здесь. Я собираюсь подать сегодня с обходным взломом. Я дам всем знать, если меня отвергнут. – shawnwall

1

У меня был тот же вопрос в моем приложении, где я представил пользовательский делегат/источник данных к более контроллеру Tableview. Я не понял, почему, но кажется, что метод _layoutCells вызывается на более контроллере tableview. я установил его, добавив этот метод:

-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector 
{ 
    // self.viewController is my tabBarController 
    UINavigationController* moreNavigationController = self.viewController.moreNavigationController; 

    // Retrieve the more list controller (it is the first in the hierarchy) 
    id moreListController = moreNavigationController.viewControllers.firstObject; 

    Class moreTableViewClass = [moreListController class]; 
    if (moreTableViewClass) { 
     return [moreTableViewClass instanceMethodSignatureForSelector:aSelector]; 
    } 

    return nil; 
} 

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

+0

Для меня: ваш метод возвращает селектор для _layoutCells, что то же самое вызывает проблему, а затем вызывает «непризнанный селектор». –

3

Благодаря GenesisST за его ответ, но я знаю, что методы вызваны по причине. И обычно layoutCells будет вызывать макет для всех subviews. Хотя я скорее жду ответа от Apple, мне нравятся другие люди, которые должны представить мое приложение в заданной временной шкале.

В моем случае я получил эту ошибку из-за некоторых хаков. Я заменил делегат UIMoreNavigationController, который является недокументированным классом Apple, поэтому я мог ожидать ошибки. Я делаю этот взлом, чтобы расширить функциональные возможности вкладки «Дополнительно», и эта ошибка возникает только при изменении делегата table_allNovigationController.

Итак, я храню их делегат, меняю его, а затем вызываю _layoutCells своему делегату, когда iOS вызывает его в моем классе.

- (void)_layoutCells 
{ 
    if([self.moreTableViewDelegate respondsToSelector:@selector(_layoutCells)]){ 
     [self.moreTableViewDelegate performSelector:@selector(_layoutCells)]; 
    } 
} 

Я не знаю, если это применимо, чтобы кто-то здесь, но только в том случае, если кто-то приходит к SO с моим краем корпуса.

+1

Спасибо, Майкл! Я тоже замещал больше делегата контроллера контроллера. Я попытался проверить, действительно ли суперкласс выполнил _layoutCells, но это не так, потому что это был делегат, который он пытался вызвать! – GenesisST

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