2012-09-24 19 views
11

मेरा लक्ष्य शीर्ष टूलबार में मेरे कस्टम एक्शन आइटम बटन का उपयोग करके, आईओएस 6 के लिए अपने आईपैड एप्लिकेशन में QLPreviewController का उपयोग करना है। आईओएस 5.1 तक मेरा समाधान था। मैं एक वर्ग कि QLPreviewController फैली इस्तेमाल किया और घटक जीवन चक्र के दौरान मैं की तरहआईओएस 6 में QLPreviewController के साथ कस्टम नेविगेशन बटन बटन

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

कुछ iOS6 के साथ इस चाल अधिक काम नहीं करता था, और अब यह असंभव परिवर्तन navigationItem विन्यास लगता है। मुझे लगता है कि यूआईएक्टिविटी और सोशल फ्रेमवर्क का परिचय शामिल हो सकता है और शायद यह नेविगेशन इटैम पर काम करने के लिए और अधिक प्रभावी नहीं है, लेकिन मुझे कोई समाधान मिल सकता है। कोई सुझाव? धन्यवाद, अलविदा

+0

इसी तरह की समस्या: http://stackoverflow.com/questions/12568508/custom-view-in-tab-bar-does-no-longer-work-in-ios6 – mark

+0

मुझे एक ही समस्या है। हल करने की कोशिश कर रहा है ... – wzbozon

+0

एक ही समस्या है। अब मानक शेयर बटन को प्रतिस्थापित या निकालने के लिए प्रतीत नहीं होता है। – Aron

उत्तर

0

मैंने इस बटन को बदलने के लिए लंबे समय तक प्रयास किया। सबव्यूव्स, इत्यादि की तरह लग रहा है ऐसा लगता है कि इस क्रिया/शेयर बटन को नौसेना के लिए एक परत के रूप में रखा जाता है। बार। QLPreviewController subclass में शीर्षक के बजाय एक और बटन जोड़ कर मैं अपने लिए इस मुद्दे को हल करके समाप्त हुआ।

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

मुझे मिला एक वर्कअराउंड QUPreviewController को मेरे UIViewController में पूर्णस्क्रीन सबव्यू के रूप में जोड़ रहा है, साथ ही साथ UINavigationBar के साथ, मैं इसे पसंद कर सकता हूं। नेविगेशन बार को छिपाने और दिखाने के लिए, QLPreviewController पर उपयोगकर्ता टैप करते समय समझने के लिए शेष रहें। मैंने stardard uiviewcontroller विधियों के साथ प्रयास किया (स्पर्श करता है, स्पर्श करता है, स्पर्श, छूता है) साथ ही इशारा प्रबंधक, लेकिन जब उस घटक पर उपयोगकर्ता टैप करते हैं तो इसे रोकना मुश्किल लगता है। – bovello

1

ठीक है, मुझे अच्छी खबर और बुरी खबर मिली है।

अच्छी खबर यह है कि मुझे पता चला है कि यह क्यों काम नहीं कर रहा है।

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

नेविगेशन पट्टी अब QLPreviewControllersView को देखते पदानुक्रम के भीतर गहरे स्थित है::

QLPreviewViewController.view-> UIView-> UIView-> QLRemotePreviewContentController- iOS6 में QLPreviewController के navigationItem अब एक navigationBar है > 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]; 
     } 
    } 
} 

बस उस विधि को पारित [आत्म दृश्य] और यह पाश जब तक यह प्रश्न में टैब बार पाता होगा। फिर आप अपना खुद का हटा सकते हैं या जोड़ सकते हैं।

बुरी खबर यह है कि आप निजी एपीआई एक्सेस कर रहे हैं और इसका उपयोग ऐप स्टोर द्वारा आपके ऐप को खारिज कर देगा। हालांकि यह एकमात्र उत्तर है जिसे मैंने देखा है। यह देखना अच्छा लगेगा कि ऐसा करने का कोई गैर-निजी तरीका है, लेकिन जिस तरह से इसे स्थापित किया गया है, यह असंभव लगता है।

इसके अलावा, यह विधि केवल तभी काम करेगी जब बार पहले ही स्थिति में हो। इसे कॉल करने के लिए सबसे अच्छी जगह 'viewDidAppear' है लेकिन यह 100% समय पर काम नहीं करती है।

+0

एक UIDocumentInteractionController में QLPreviewController को केवल * QLPreviewViewController.view-> UIView * मिला है, इसलिए मुझे अपने हैकी श्रेणी समाधान का उपयोग करना होगा: -/ – tougher

+0

हाँ, मैं किसी भी सबव्यू में किसी भी UINavigationBars को नहीं ढूंढ पाया। मैंने super.view.subviews पर जाने का भी प्रयास किया (चूंकि मैं QLPreviewController subclass) – valheru

6

मुझे वास्तव में वास्तव में एक समाधान की आवश्यकता है, इसलिए मैंने इसे बनाया।

हाँ, यह बदसूरत है। हाँ, यह किसी भी समय तोड़ सकता है। और हाँ, मैं देव नरक के लिए कठोर हो जाऊंगा, लेकिन मेरे मालिक ने मुझे नाराज आँखों से मुझ पर घूरना बंद कर दिया ... अभी के लिए।

@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 

स्टीव जॉब्स मुझे मेरे सपनों में शिकार जब तक मैं एक उचित समाधान मिल जाएगा ...

+0

बीटीडब्लू: मैं एक UIDocumentInteractionController का उपयोग करता हूं, सीधे QLPreviewController नहीं। – tougher

+1

यदि आप एक्शन बटन को हटाना चाहते हैं, तो * qlpc.navigationItem.rightBarButtonItem * to * nil * को बदलें। – tougher

+1

आपको माफी मांगने की आवश्यकता नहीं है क्योंकि ऐप्पल अनुकूलन के लिए उचित API प्रदान नहीं करता है ... – HyBRiD

2

यह काम करता है अगर आप

अंदर आप यह कर करना होगा शीर्ष उपकरण पट्टी में कार्रवाई आइटम बटन बदल रहे हैं
-(void)viewDidAppear:(BOOL)animated{ 
    //add code necessarry to change your action buttons of toptoolbar in quicklook 
} 

दृश्य के बाद rightBarButtonItems का उपयोग किया जा सकता है।

+0

पीडीएफ समाप्त होने के बाद दाएं बार्बटन दिखाई देता है। इसलिए कभी-कभी यह असफल हो जायेगा। –

1

सबसे अच्छा तरीका अपने स्वयं के नियंत्रक को लागू करना और QLPreviewController के दृश्य को सबव्यूव के रूप में उपयोग करना है। उस स्थिति में आप कस्टम आइटम के साथ अपना खुद का नेविगेशन बार बना सकते हैं।

संबंधित मुद्दे