2013-08-29 10 views
6

मुझे इसके बारे में कई प्रश्न हैं लेकिन उत्तर मेरी समस्या का समाधान नहीं करते हैं।दो मोडल व्यू कंट्रोलर को खारिज करना

मेरे पास दो नियंत्रक हैं जिन्हें मैंने presentModalViewController का उपयोग करके प्रस्तुत किया है।

मैंने मॉडलट्रांसशन स्टाइल को पहले नियंत्रक को जोड़ा जो मुख्य नियंत्रक द्वारा बुलाया जाता है। पहले नियंत्रक ने दूसरे नियंत्रक को सामान्य रूप से (संक्रमण शैली के बिना) प्रस्तुत किया।

FirstVC *first = [[FirstVC alloc] initWithNibName:@"FirstVC" bundle:nil]; 
first.modalTransitionStyle = UIModalTransitionStylePartialCurl; 
[self presentModalViewController:first animated:YES]; 

SecondVC *second = [[SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil]; 
[self presentModalViewController:second animated:YES]; 

इस कोड मैं MainVC पर जाने के लिए प्रयोग किया जाता है:

[self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES]; 

और यह क्या हुआ है:

enter image description here

पेज लहराना नहीं किया। मुझे इसका सामना करने का क्या कारण है?

उत्तर

3

आप इस कॉल के साथ एक के बाद एक अपने दो दृश्य प्रस्तुत करना चाहिए:

[self presentViewController:firstViewController animated:YES completion:^(
    [self presentViewController:secondViewController animated:YES completion:^(

    }]; 
}]; 

इस बेहतर व्यवहार करना चाहिए। साथ ही, पता है कि आपको बाद में उन दोनों दृश्य नियंत्रकों को खींचना होगा।

[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:^{ 
    [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:^{ 

    }]; 
}]; 
+0

उत्तर देने के लिए धन्यवाद। लेकिन दूसरे नियंत्रक को केवल पहले नियंत्रक के दृश्य के अंदर एक बटन पर क्लिक करने के बाद बुलाया जाएगा। –

+0

आह, तो बस सुनिश्चित करें कि आप अंत के बाद दोनों को खींचें। – HalR

+0

हाय हैलआर, आपके उत्तर ने मेरी मदद की। मैंने जो किया वह पूरा करने के ब्लॉक के अंदर अधिसूचना पोस्ट करना था। 'कोड' [self.presentingViewController dismissViewController अनुमानित: कोई समापन नहीं:^{[[NSNotificationCenter defaultCenter] postNotificationName: @" BACKTOMAIN "ऑब्जेक्ट: nil];}]; –

2

ऐसा लगता है कि आप 'दूसरा' को खारिज किए बिना 'पहले' को खारिज कर रहे हैं।

एप्पल की सिफारिश करने का तरीका प्रतिनिधिमंडल के साथ है।

मेनवीवी को 'पहले' का प्रतिनिधि बनाने का प्रयास करें ताकि पहले मुख्य रूप से मेनविच की विधि को स्वयं को खारिज कर सकें। 'पहले' की 'प्रतिनिधि' संपत्ति घोषित करके इसे 'पहली' तत्काल होने पर इसे मुख्यVC पर सेट करके करें। फिर first.h में 'firstDelegate' प्रोटोकॉल को परिभाषित करें जिसमें कुछ फ़ंक्शन 'dismissFirst' शामिल हैं और फिर mainVC में first.h आयात करें। अब मुख्य रूप से 'पहले' को खारिज करने के लिए मुख्य वीवीसी में बर्खास्त करें और जो कुछ भी आप चाहते हैं वह करें जो पहले प्रदर्शित किया जा रहा है।

गैस्प ... अब 'पहले' को 'दूसरा' का एक प्रतिनिधि बनाते हैं, और बस 'डिसमिस सेकेंड' फ़ंक्शन को मुख्य वीवीसी के 'डिसमिस फर्स्ट' फ़ंक्शन को कॉल करें और सभी दुनिया के साथ सही होंगे।

मुझे पता है कि यह बहुत जटिल है लेकिन प्रतिनिधिमंडल एक कोर आईओएस अवधारणा है और यह कहां उपयोग किया जाता है इसका सबसे महत्वपूर्ण उदाहरण है।

यह कैसे काम करता है यह एक अच्छी व्याख्या है। http://chrisrisner.com/31-Days-of-iOS--Day-6%E2%80%93The-Delegate-Pattern

और मैं आपको ऐप्पल इंजीनियर के दिमाग की भीतरी मशीनों को समझने के लिए अपनी कभी खत्म होने वाली खोज में शुभकामनाएं देता हूं जिसे ओबज-सी भी कहा जाता है।

+1

कई नियंत्रकों को खारिज करना ठीक है जो एक-दूसरे को श्रृंखला में प्रस्तुत करते हैं। यदि आप श्रृंखला में पहले व्यक्ति को खारिज करते हैं, तो बाकी सभी को खारिज कर दिया जाता है। इस विशिष्ट मामले में, उस समस्या को हल करने वाली प्रस्तुति शैलियों से समस्या का परिणाम होता है। – rdelmar

+0

मैंने हलर द्वारा दिए गए कोड और कुछ संशोधन का उपयोग करके समस्या का समाधान किया है। मैंने अन्य नियंत्रक को खारिज करने के लिए एक अधिसूचना जोड़ा। –

6

मेरे प्रयोगों में, ऐसा लगता है कि आपके पास आंशिक कर्ल के बाद मानक प्रस्तुति (कवर वर्टिकल) नहीं हो सकती है, और उन्हें एक ही समय में खारिज कर दिया जाता है, जब तक कि आप एनीमेशन सेट के साथ बर्खास्त नहीं करते हैं।में firstVC एनीमेशन के साथ viewDidAppear में फिर से खारिज, परीक्षण है कि नियंत्रक नहीं है के बाद फिर

-(IBAction)dismissSelf:(id)sender { 
    [self dismissViewControllerAnimated:NO completion:nil]; 
} 

:

इस हालांकि ठीक करने के लिए एक तरह से (इस कोड secondVC में है) नहीं एनीमेशन के साथ secondVC आउट करना होता है प्रस्तुत किया जा रहा:

-(void)viewDidAppear:(BOOL)animated { 
    if (![self isBeingPresented]) { 
     [self dismissViewControllerAnimated:YES completion:nil]; 
    } 
} 

ऊपर कोड वापस प्रारंभिक नियंत्रक के दृश्य को पाने के लिए काम करता है, आप firstVC के दृश्य दिखाई देते हैं इससे पहले कि कर्ल uncurls देखेंगे। यदि आप इसे देखना नहीं चाहते हैं, तो मुझे इसे ठीक करने के लिए एकमात्र तरीका मिल सकता है, दूसरी सीवीसी की एक छवि बनाना था, इसे दूसरी छवि की बर्खास्तगी करने से पहले (छवि दृश्य में) को पहले एवीसी में एक सबव्यू जोड़ें। तो, ऐसा करने के लिए, secondVC में कोड इस बजाय होना चाहिए (ध्यान दें कि आप इस के लिए काम करने के लिए secondVC में QuartzCore से लिंक और इसे आयात करने के लिए है कि):

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    UIImage *img = [self imageWithView:self.view]; 
    FirstViewController *first = (FirstViewController *)self.presentingViewController; 
    UIImageView *iv = [[UIImageView alloc] initWithFrame:first.view.bounds]; 
    iv.image = img; 
    [first.view addSubview:iv]; 
} 


-(IBAction)dismissSelf:(id)sender { 
    [self dismissViewControllerAnimated:NO completion:nil]; 
} 


- (UIImage *)imageWithView:(UIView *)view { 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, [[UIScreen mainScreen] scale]); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return img; 
} 
+0

मैंने [self.presentingViewController dismissViewController का उपयोग करके समस्या का सफलतापूर्वक समाधान किया है: कोई समापन नहीं:^[[[NSNotificationCenter defaultCenter] postNotificationName: @ "BACKTOMAIN" ऑब्जेक्ट: nil];}]; फिर प्राप्तकर्ता नियंत्रक में, मैंने जोड़ा [स्वयं को खारिज करेंडलव्यू कंट्रोलरएनिएटेड: हाँ]; उत्तर के लिए भी धन्यवाद :) –

0

मैं भी यही संदेह नहीं था। मैंने किसी अन्य तरीके से हल किया -

चरण 1: वैश्विक वर्ग (सिंगलटन) में आप एक चर ध्वज परिभाषित कर सकते हैं।

@property (nonatomic) int flag; 

चरण 2: मान लीजिए आप, second view controller और first view controller को खारिज करने और वापस Main view controller पर लौटना ही होगा, जबकि आप यह मान सेट कर सकते हैं दूसरे दृश्य नियंत्रक नकारने के रूप में लगता है 1

[[Global sharedObject] setFlag:1]; 
[self.navigationController popViewControllerAnimated:YES]; 

चरण 3: आप में से - (void)viewWillAppear:(BOOL)animated विधि first view controller आप इस विधि का सेट कर सकते हैं -

if([[Global sharedObject] flag] == 1) 
{ 
    [[Global sharedObject] setFlag:0]; 
    [self performSelector:@selector(back) withObject:nil afterDelay:0.5]; 
} 

- (void) back 
{ 
[self.navigationController popViewControllerAnimated:YES]; 
} 

मुझे आशा है कि आपका जवाब इस का उपयोग कर हल किया जाता है। यदि आपको अभी भी संदेह है, तो आप पूछ सकते हैं। चीयर्स :)

0
- (UIViewController*)topViewController 
{ 
    UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController; 
    while (topController.presentedViewController) { 
     topController = topController.presentedViewController; 
    } 
    return topController; 
} 


- (void)dismissAllModalController{ 

    __block UIViewController *topController = [self topViewController]; 

    while (topController.presentingViewController) { 
     [topController dismissViewControllerAnimated:NO completion:^{ 

     }]; 
     topController = [self topViewController]; 
    } 
} 

मुबारक कोडिंग :)

0

आप एक unwind segue उपयोग करने के लिए की जरूरत है। दृश्य नियंत्रक में एक "खाली" IBAction बनाएं जिसे आप segue करना चाहते हैं।

@IBAction func unwindToController(segue: UIStoryboardSegue) { 

} 

फिर अपने स्टोरीबोर्ड पर जाएं और उस नियंत्रक का चयन करें जिसे आप से आना चाहते हैं। किसी चयनित नियंत्रक के शीर्ष पर स्थित आइकनों में, बाईं ओर एक छोटे से सफेद वर्ग के साथ एक पीला सर्कल होना चाहिए, फ़ाइल मालिक उर्फ। Ctrl- उस व्यू कंट्रोलर के "बाहर निकलें" लेबल पर खींचें जिसे आप खोलना चाहते हैं। बाहर निकलने वाले नियंत्रकों के पेड़ के नीचे, या स्टोरीबोर्ड पर सफेद वर्ग डब्ल्यू/दायां तीर वाला दायां सबसे लाल वर्ग छवि के रूप में पाया जा सकता है। यह एक संवाद पॉपअप करेगा, आपके द्वारा बनाई गई unwindToController क्रिया का चयन करें।

एक नया "बाहर निकलने के लिए अनइंड सेग्यू" आपके FROM नियंत्रक में दिखाई देगा। इसे डबल क्लिक करें और इसे पहचानकर्ता दें, उदा। unwindIdentifier

अब जब आप दो नियंत्रक तनाव कम करने के लिए, अपने नियंत्रक से उपयोग में हैं:

self.performSegueWithIdentifier("unwindIdentifier", sender:nil) 

कि बीच नियंत्रक छोड़ सकते हैं और एक दूसरे के लिए तनाव कम, केवल दिखा एनीमेशन में नियंत्रक से होगा।

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