Objective-C是一种动态特性非常强大的语言,但在日常使用过程中可能不会太接触到一些底层的使用方式,最近发现了一个项目很好的展现了这类特性。
怎样扩展UITabBarController大概是每个iOS开发者都会碰到的问题,我在实践中尝试用一些方法来解决这类问题,在没有完美解决这个问题后,我开始寻找一些其它的实现方案。最近在github上找到了名为JBTabBarController项目,在看过源码之后,我觉得这个项目的实现非常巧妙,很好的利用了Objective-C的动态特性,而这类动态特性封装由另外一个项目JRSwizzle来提供。这个项目非常有意思,其实现原理可先看看这篇文章深入浅出Cocoa之Method Swizzling。
重点在https://github.com/jinthagerman/JBTabBarController/blob/master/JBTabBarController/UINavigationController%2BJBAdditions.m中
+ (void)initialize {
if (self == [UINavigationController class]) {
[UINavigationController jr_swizzleMethod:@selector(pushViewController:animated:)
withMethod:@selector(jb_pushViewController:animated:)
error:nil];
}
}
– (void)jb_pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
viewController.JBTabBarController = self.JBTabBarController;
[self jb_pushViewController:viewController animated:animated];
}
在运行时非常优雅的修改了pushViewController:animated:消息的实现,这种思路让我为之一亮。
另外,这位高人写的 深入浅出Cocoa系列 文章非常之不错,强烈建议学习。