2012-05-03 7 views
25

एक आईपैड ऐप में मैं UISplitViewController का उपयोग कर रहा हूं। पोर्ट्रेट मोड में ऐप लॉन्च होने पर मुझे मास्टर पॉपओवर दिखाने के लिए मजबूर होना आवश्यक है।UISplitViewController: ऐप लॉन्च में मास्टर पॉपओवर दिखाने के लिए कैसे बल? (चित्र)

अब मैं इस कोड का उपयोग कर रहा हूं और यह आईओएस 5.0 पर अच्छा काम करता है।

if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) { 
    if ([[[AppDelegate sharedAppDelegate] splitViewController] respondsToSelector:[[[AppDelegate sharedAppDelegate] btnMenu] action]]) { 
     [[[AppDelegate sharedAppDelegate] splitViewController] performSelector:[[[AppDelegate sharedAppDelegate] btnMenu] action]]; 
    }    
} 

लेकिन आईओएस 5.1 (नए प्रकार के मास्टर पॉपओवर के साथ) में व्यवहार यादृच्छिक प्रतीत होता है। कभी-कभी पॉपओवर पूर्णस्क्रीन में दिखाता है और कभी-कभी अच्छी तरह से काम करता है।

5.1 के लिए कुछ सुझाव?

+1

यहां एक अच्छा जवाब है: http://stackoverflow.com/a/15817100/733862 – akofink

उत्तर

13

मैं थोड़ी देर के लिए इस के साथ संघर्ष कर रहा था, और अब भी मैं समाधान के साथ 100% खुश नहीं हूं, लेकिन यह एकमात्र चीज है जिसे मैं मौजूदा बाधाओं के साथ आने में सक्षम हूं।

पहले, निम्न प्रतिनिधि विधि ओवरराइड:, आप जब

barButtonForMaster = barButtonItem; 

तब:

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController 

और इसका इस्तेमाल बार बटन आइटम के लिए एक संदर्भ हड़पने के लिए, और एक इवर में संग्रहीत मास्टर व्यू कंट्रोलर दिखाना चाहते हैं, इस तरह एक कॉल करें:

[barButtonForMaster.target performSelector: barButtonForMaster.action withObject: barButtonForMaster]; 

यदि आप प्रति करना चाहते हैं शुरू में इस अधिकार के रूप में है, तो क्रम में कुछ देरी का उपयोग दुर्घटनाग्रस्त (उपयोगी टिप्पणी के लिए धन्यवाद) एप्लिकेशन को रोकने के लिए:

[barButtonForMaster.target performSelector: barButtonForMaster.action withObject: barButtonForMaster afterDelay:1]; 

उस मामले में आप सही विभाजित दृश्य प्रतिनिधि विधि में चयनकर्ता प्रदर्शन कर सकते हैं।

+1

धन्यवाद। मैं इसे अपने कोड के साथ अपने पिछले कोड के साथ करता हूं। लेकिन कभी-कभी ऐप दुर्घटनाग्रस्त हो जाता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि मैं इसे splitViewController प्रतिनिधि में करता हूं और शायद, कुछ मामलों में, नियंत्रक यह पूरी तरह से नहीं बनाया गया है। अब मैं उस कोड को perfromSelectorAfterDelay के साथ करता हूं और बहुत अच्छी तरह से काम करता हूं। धन्यवाद। – alejandromp

+0

इसके परिणामस्वरूप एक कंपाइलर संभावित मेमोरी रिसाव चेतावनी – anders

13

रोब के जवाब पर विस्तार, इस (विस्तार के लिए स्क्रीन के viewDidLoad में) मेरे लिए अच्छी तरह से काम करता है:

//If in portrait mode, display the master view 
if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) { 
    [self.navigationItem.leftBarButtonItem.target performSelector:self.navigationItem.leftBarButtonItem.action withObject:self.navigationItem]; 
} 

एक अलग संदर्भ लाने के लिए कोई ज़रूरत नहीं, self.navigationItem.leftBarButtonItem बजाय

+0

यह आश्चर्यजनक है और पूरी तरह से काम करता है! यह मुझे चेतावनी दे रहा है, "प्रदर्शन चयनकर्ता रिसाव का कारण बन सकता है क्योंकि इसका चयनकर्ता अज्ञात है" क्या आप जानते होंगे कि इसके बारे में क्यों और क्या करना है? – bllubbor

+2

एएफएआईके संकलक विश्लेषण कॉल का विश्लेषण करता है और एआरसी संदर्भ काउंटरों (कचरा संग्रह को प्रबंधित करने के लिए) को प्रबंधित करने के लिए कोड जोड़ता है। इस तरह की एक विधि को कॉल करना जावा में प्रतिबिंबों का उपयोग करना है (रनटाइम के दौरान किया गया), इसलिए संकलक इस मामले में अपने रेफकाउंट जादू नहीं कर सकता है। हालांकि, जब तक विधि कहा जाता है, तब तक आवंटित ऑब्जेक्ट (जो तब रिसाव होगा) वापस नहीं करता है, यह कोई समस्या नहीं होगी। इस मामले में, हम बुलाए गए विधि से कुछ भी वापस नहीं कर रहे हैं। इस चेतावनी से बचने के लिए, देखें: http://www.learningipadprogramming.com/2012/04/03/how-to-ignore-performselector-leak-warning/ – Setomidor

+1

अद्भुत धन्यवाद। – bllubbor

5

का उपयोग कर आप तो एप्लिकेशन लॉन्च पर यह की जरूरत है, अपने विवरण दृश्य नियंत्रक में इस विधि को ओवरराइड:

-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation 
{ 
    return NO; 
} 

लेकिन यदि आप तो यह बाद में छिपाने के लिए यह रूप में यद्यपि लग रहा है की जरूरत है विधि नहीं कहा जाता है, इसलिए आपको इसे मैन्युअल रूप से छिपाना होगा।

+0

धन्यवाद! यह स्वीकार्य उत्तर होना चाहिए। – Bill

+1

यह आईओएस 8 में छोड़ा गया है। – phatmann

0

बारबटन इटिम के आसपास मूर्खतापूर्ण संदर्भ रखने की आवश्यकता नहीं है। बस एक ही लक्ष्य/कार्रवाई को बुलाओ। मेरा उत्तर https://stackoverflow.com/a/25695923/1021430

देखें लक्ष्य विभाजित दृश्य नियंत्रक है, और कार्रवाई toggleMasterVisible है:

+0

कि टॉगलमास्टरविज़िबल एक निजी विधि है। –

26

यहां 5.1 के लिए कोई सुझाव है, लेकिन एक 8.0 के लिए:

iOS8 के साथ अब, वहाँ के एक समूह रहे हैं UISplitViewController कॉन्फ़िगरेशन के लिए नई विधियां।

अपने मामले में, बस preferredDisplayMode में सही मान निर्धारित करें, उदाहरण के लिए MasterViewController viewDidLoad में।

ऑब्जेक्टिव-सी:

- (void)viewDidLoad { 
    // configuring splitviewcontroller 
    self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible; 

    //.... 
} 

स्विफ्ट:

override func viewDidLoad() { 
     self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible 
    } 

लेकिन यह केवल पाठ्यक्रम iOS8 की है।

+5

यह साइड-बाय-साइड डिस्प्ले को मजबूर करता है। ओपी अनुरोध के रूप में यह पॉपओवर मोड में मास्टर व्यू नहीं दिखाता है। – phatmann

+0

@ फ़ैटमैन, मुझे नहीं लगता कि एलेजेंड्रोम्प पॉपओवर के बारे में बात कर रहा था। वह कहता है * मुझे मास्टर पॉपओवर दिखाने के लिए मजबूर होना चाहिए * लेकिन इसका मतलब यह नहीं है कि वास्तव में कुछ भी नहीं है। संदर्भ को ध्यान में रखते हुए, वह परिदृश्य में, पोर्ट्रेट मोड में मास्टर व्यू साइड को प्रदर्शित करने के बारे में बात करता है। – Martin

+0

को भी विवरणव्यू नियंत्रक में बुलाया जा सकता है – fujianjin6471

7

iOS8 के लिए सबसे आसान तरीका है निम्नलिखित के साथ है:

self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay; 

मैं इस का उपयोग करते हैं एप्लिकेशन masterViewController में लॉग-इन दिखाने के लिए पहली बार शुरू की है। अन्य सभी मामलों मैं

self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAutomatic 
1

एक थोड़ा कम hacky भिन्नता (स्विफ्ट) का उपयोग में:

let btn = self.splitViewController!.displayModeButtonItem() 
btn.target?.performSelector(btn.action, withObject: btn) 
1

मैं इस समाधान का उपयोग करें:
viewDidLoad में splitViewController में सेट displayMode .primaryOverlay को

override func viewDidLoad() { 
    if self.isCollapsed == false, self.displayMode == .primaryHidden { 
     self.preferredDisplayMode = .primaryOverlay 
    } 
} 

और दृश्य में विल्लएपियर इसे वापस सेट करें। स्वचालित

override func viewWillAppear(_ animated: Bool) { 
    self.preferredDisplayMode = .automatic 
} 

इस तरह मास्टर दृश्य UISplitViewController के लॉन्च पर दिखाया जाएगा और अभिविन्यास बदलने के बाद डिफ़ॉल्ट व्यवहार होगा।

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