iOS:iOS 7.1上的子类UITabBarController上有更多选项卡崩溃

时间:2014-03-10 19:18:07

标签: ios7 uitabbarcontroller

我只是更新到iOS 7.1,我得到一个名为“_layoutCells”的函数无法识别的选择错误。

我有一个简单的UITabBarController子类。

3 个答案:

答案 0 :(得分: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 :(得分:3)

感谢GenesisST给出了答案,但我知道方法是有原因的。通常,layoutCells会调用所有子视图的布局。虽然我宁愿等待Apple的回答,但我希望其他人需要在给定的时间线内提交我的应用程序。

在我的情况下,由于一些黑客攻击我得到了这个错误。我已经替换了UIMoreNavigationController委托,它是Apple的一个未记录的类,所以我可以预料到错误。我正在做这个hack来扩展More选项卡的功能,而这个错误只发生在我更改moreNavigationController tableView的委托时。

所以我存储他们的委托,更改它,然后当iOS在我的课堂上调用它时,将_layoutCells调用到他们的委托。

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

我不知道这是否适用于此处的任何人,但以防其他人因我的边缘情况而来到这里。

答案 2 :(得分:1)

我在我的应用程序中遇到了同样的问题,我向更多的tableview控制器提供了自定义委托/数据源。我还没弄清楚原因,但似乎在更多的tableview控制器上调用_layoutCells方法。 我修复了它,添加了这个方法:

-(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;
}

我已经完成了各种测试,这似乎是一个可靠的解决方法。但如果你能找到更好的解决方案......分享吧!