2013-01-04 14 views
9

मेरे पास एक व्यू कंट्रोलर है कि जब मैं एक बटन दबाता हूं तो एक बच्चे दृश्य नियंत्रक दिखाई देता है। यह पूरी तरह से काम करता है लेकिन मैं इस बच्चे के दृश्य नियंत्रक को दूसरे के लिए बदलना चाहता हूं अगर मैं इसके अंदर के बटन को दो चरण लॉगिन की तरह करता हूं। कोई विचार? मुख्य दृश्य नियंत्रक से मुझे पता है कि बच्चे को कैसे दिखाया जाता है लेकिन बच्चे से मुझे नहीं पता कि यह कैसे करना है। स्टोरीबोर्ड का उपयोग करबाल दृश्य नियंत्रक बदलें

+1

मान लें कि हम यहां कस्टम कंटेनर व्यू कंट्रोलर के बारे में बात कर रहे हैं, आप बच्चे को संक्रमण करने के लिए माता-पिता को एक विधि वापस ले सकते हैं। या आप एक कस्टम सेग्यू कर सकते हैं जो एक बच्चे नियंत्रक को प्रतिस्थापित करता है: http://stackoverflow.com/questions/14125145/ios-best-practices-for-a-one-way-navigation-controller/14125580#14125580 – Rob

+0

धन्यवाद आपका जवाब। इसलिए मुझे माता-पिता के पास वापस जाना है और दूसरे दृश्य नियंत्रक को बच्चे के रूप में दिखाना है। लेकिन कैसे पता है कि मैं दूसरा दिखाना चाहता हूं। क्योंकि मैं बच्चे को सेगू की तरह बदलने की कोशिश करता हूं लेकिन नया दृश्य नियंत्रक सभी विंडो में दिखाई देता है जो पहले की तरह नहीं है। – Anna

+0

ठीक है, आखिरकार मुझे कस्टम सेग्यू मिलता है जो एक बच्चे को बदल देता है। :) – Anna

उत्तर

44

, आप बना सकते हैं अपने खुद के बच्चे को segue, जैसे की जगह:

ReplaceSegue.h

@interface ReplaceSegue : UIStoryboardSegue 

@end 

ReplaceSegue.m

@implementation ReplaceSegue 

- (void)perform 
{ 
    UIViewController *source = self.sourceViewController; 
    UIViewController *destination = self.destinationViewController; 
    UIViewController *container = source.parentViewController; 

    [container addChildViewController:destination]; 
    destination.view.frame = source.view.frame; 
    [source willMoveToParentViewController:nil]; 

    [container transitionFromViewController:source 
          toViewController:destination 
            duration:0.5 
            options:UIViewAnimationOptionTransitionCrossDissolve 
           animations:^{ 
           } 
           completion:^(BOOL finished) { 
            [source removeFromParentViewController]; 
            [destination didMoveToParentViewController:container]; 
           }]; 
} 

@end 

तब आप अपने स्टोरीबोर्ड खोल सकते हैं, अपने कंटेनर व्यू कंट्रोलर पर और कंटेनर पर कंटेनर व्यू डालें, पहले बच्चे के दृश्य से दूसरे बच्चे के दृश्य में एक कस्टम सेग्यू डालें। आप दो बच्चे दृश्यों के बीच कस्टम segue के लिए ReplaceSegue वर्ग निर्दिष्ट करने के लिए चाहता हूँ:

container controller storyboard

ध्यान दें कि अगर आप ठीक ढंग से autolayout या दूसरे बच्चे को देखने पर स्वत: आकार बदलना का उपयोग किया है, सब कुछ ठीक काम करेंगे (विशेष रूप से ReplaceSegue में गंतव्य नियंत्रक के दृश्य के फ्रेम की मैन्युअल सेटिंग के साथ)। लेकिन इंटरफ़ेस बिल्डर में, उस दूसरे बच्चे के दृश्य का लेआउट बिल्कुल सही नहीं दिखता है और दृश्य के उचित डिजाइन को थोड़ा अजीब बना सकता है, क्योंकि (कम से कम एक्सकोड 4.5 के रूप में) दूसरे बच्चे के लिए "सिम्युलेटेड मेट्रिक्स" दृश्य उचित आकार का एक अच्छा काम नहीं करता है। तो आप शायद "मुक्त अवस्था" से "अनुमानित" से है कि दूसरे बच्चे दृश्य की नकली मैट्रिक्स 'आकार में परिवर्तन करना चाहिए और उसके बाद मैन्युअल रूप से दूसरे बच्चे दृश्य के आकार को समायोजित:

container storyboard with manually adjusted second child scene size

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

+4

ध्यान दें कि मेट्रिक्स – esad

+0

@esad ठीक से अनुमान लगाने के लिए एक्सकोड को मजबूर करने के लिए चाइल्ड व्यू 1 और चाइल्ड व्यू 2 के बीच एक डमी "पुश" सेग्यू जोड़ना संभव होना चाहिए। यह एक चालाक चाल है। धन्यवाद! – Rob

+0

हे @ रोब: बहुत बहुत धन्यवाद! मैं इस सरल संक्रमण और आपके उत्तर को बनाने के लिए दो ट्यूटोरियल और ऐप्पल दस्तावेज़ीकरण का पालन कर रहा हूं, बस मुझे कुछ मिनटों में इस नेविगेशन मुद्दे को हल करने में मदद मिली ... तो क्या होगा यदि यह सुरुचिपूर्ण नहीं है? यह ब्रिलिएंट है :-) –

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