我的目标是使用顶部工具栏中的自定义操作项按钮,在iOS6的iPad应用程序中使用QLPreviewController。
直到iOS5.1,我都有解决方案。我使用了一个扩展QLPreviewController的类,在组件生命周期中,我做了类似的事情
[[self navigationItem] setRightBarButtonItems:[NSArray arrayWithObject:[self buildCustomButton]]];
在iOS6中,此技巧不再起作用,现在似乎无法更改navigationItem配置。我认为可能会涉及UIActivity和Social Framework的引入,也许对NavigationItem的工作不再有效,但是我可以找到任何解决方案。
有什么建议吗?
谢谢再见
最佳答案
我真的真的需要一个解决方案,所以我做了。
是的,这很丑。是的,它可能随时会中断。是的,我将陷入困境,但我的老板确实没有生气地盯着我……现在。
@implementation UINavigationItem (Custom)
void MethodSwizzle(Class c, SEL origSEL, SEL overrideSEL);
- (void) override_setRightBarButtonItem:(UIBarButtonItem *)item animated:(BOOL)animated{
if (item && [item.target isKindOfClass:[QLPreviewController class]] && item.action == @selector(actionButtonTapped:)){
QLPreviewController* qlpc = (QLPreviewController*)item.target;
[self override_setRightBarButtonItem:qlpc.navigationItem.rightBarButtonItem animated: animated];
}else{
[self override_setRightBarButtonItem:item animated: animated];
}
}
+ (void)load {
MethodSwizzle(self, @selector(setRightBarButtonItem:animated:), @selector(override_setRightBarButtonItem:animated:));
}
void MethodSwizzle(Class c, SEL origSEL, SEL overrideSEL) {
Method origMethod = class_getInstanceMethod(c, origSEL);
Method overrideMethod = class_getInstanceMethod(c, overrideSEL);
if (class_addMethod(c, origSEL, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod))) {
class_replaceMethod(c, overrideSEL, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
}else{
method_exchangeImplementations(origMethod, overrideMethod);
}
}
@end
史蒂夫·乔布斯(Steve Jobs)会梦dream以求的我,直到找到合适的解决方案为止。
关于objective-c - iOS6中带有QLPreviewController的自定义navigationItem按钮,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12568504/