11

私の目標は、上部のツールバーにあるカスタム アクション アイテム ボタンを使用して、iOS6 用の iPad アプリケーションで QLPreviewController を使用することです。iOS5.1までは解決できました。QLPreviewController を拡張するクラスを使用し、コンポーネントのライフサイクル中に次のようなことを行いました

[[self navigationItem] setRightBarButtonItems:[NSArray arrayWithObject:[self buildCustomButton]]];

iOS6 では、このトリックは機能しなくなり、現在では、navigationItem の構成を変更することはできないようです。UIActivity と Social Framework の導入が関係している可能性があり、おそらく navigationItem に取り組むことは効果的ではないと思いますが、解決策を見つけることができます。なにか提案を?ありがとさよなら

4

5 に答える 5

7

本当に解決策が必要だったので、これを作りました。

はい、醜いです。はい、いつでも壊れる可能性があります。はい、私は開発地獄に直行しますが、私の上司は怒った目で私を見つめるのをやめました.

@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

適切な解決策が見つかるまで、スティーブ・ジョブズは私の夢の中で私を追い詰めます...

于 2012-10-04T13:54:53.683 に答える
2

さて、良いニュースと悪いニュースがあります。

良いニュースは、これが機能しない理由を理解したということです。iOS6 では、QLPreviewController の navigationItem には、navigationBar がなくなりました。

(lldb) po [[self navigationItem] navigationBar];
(id) $2 = 0x00000000 <nil>

ナビゲーション バーは、QLPreviewControllersView のビュー階層の奥深くに配置されました。

QLPreviewViewController.view->UIView->UIView->QLRemotePreviewContentController->navBar->navItem->rightBarButtonItems。

以下のメソッドを使用して、探している navigationItem を見つけることができます。

- (void)inspectSubviewsForView:(UIView *)view
{
    for (UIView *subview in view.subviews)
    {  
        if ([subview isKindOfClass:[UINavigationBar class]])
        {
            UINavigationBar *bar = (UINavigationBar *)subview;
            if ([[bar items] count] > 0)
            {
                UINavigationItem *navItem = [[bar items] objectAtIndex:0];
                [navItem setRightBarButtonItem:nil];
            }
        }

        if ([subview isKindOfClass:[UIView class]] && [[subview subviews] count] > 0)
        {
            [self inspectSubviewsForView:subview];
        }
    }
}

[self view] をそのメソッドに渡すだけで、問題のタブ バーが見つかるまでループします。その後、独自のものを削除または追加できます。

もちろん、悪いニュースは、プライベート API にアクセスしていることです。これを使用すると、アプリ ストアによってアプリが拒否される可能性があります。ただし、これについて私が見た唯一の答えです。これを行う非公開の方法があるかどうかを知りたいのですが、設定方法を考えると、そうは思えません。

また、このメソッドは、バーが既に配置された後に呼び出された場合にのみ機能します。これを呼び出すのに最適な場所は「viewDidAppear」ですが、100% の場合は機能しません。

于 2012-10-04T02:04:33.437 に答える
2

上部のツールバーのアクションアイテムボタンを変更している場合は機能します。内部で行う必要があります

-(void)viewDidAppear:(BOOL)animated{
    //add code necessarry to change your action buttons of toptoolbar in quicklook
}

ビューが表示された後、rightBarButtonItemsアクセスできます。

于 2012-10-10T12:33:52.543 に答える
0

私は長い間このボタンを交換しようとしました。サブビューなどに注目しました。このアクション/共有ボタンは、ナビゲーションのレイヤーとして配置されているようです。バー。QLPreviewControllerサブクラスのタイトルの代わりにボタンをもう1つ追加することで、この問題を自分で解決することになりました。

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Button in center of Navigation Bar
    UISegmentedControl *button = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:LS(@"Save"), nil]];
    button.frame = CGRectMake(0, 0, 100, 30);
    button.center = self.view.center;
    button.momentary = YES;
    button.segmentedControlStyle = UISegmentedControlStyleBar;
    button.tintColor = [UIColor colorWithHue:0.6 saturation:0.33 brightness:0.69 alpha:0];
    [button addTarget:self action:@selector(saveToDocumentsClicked) forControlEvents:UIControlEventValueChanged];
    self.navigationItem.titleView = button;
}
于 2012-09-27T16:25:20.647 に答える