我的目标是使用顶部工具栏中的自定义操作项按钮,在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/

10-11 14:55