6

पृष्ठभूमि: मैं एक modalView कि मैंने पहले और अभी वर्तमान में एक ही viewController कि मैं सिर्फ नई जानकारी के साथ खारिज कर दिया प्रस्तुत किया है को खारिज करना चाहते हैं।iOS: खारिज और उसके माता पिता ViewController के लिए उपयोग के बिना ModalViewController पेश

समस्या: मैं माता पिता ViewController कि रीति से पहले ViewController प्रस्तुत करने के लिए एक स्पष्ट सूचक के बिना ऐसा करने में बहुत सफल नहीं रहा है। मैं इस कक्षा को लिखने की कोशिश कर रहा हूं जो पिछले viewController के कोड के साथ गड़बड़ किए बिना काम करता है।

संभावित नेतृत्व: कुछ चीजें मैं प्रयोग कर रहे हैं की जोड़ी हैं:)

1. माता पिता ViewController है, जो इस समय मैं कैसे करने के लिए पता नहीं है के लिए उपयोग पाने के लिए कोशिश कर रहा है।

UIViewController* toPresentViewController = [[UIViewController alloc] init]; 
    [self dismissViewControllerAnimated:YES completion:^{ 
     [parentViewControllerAccessor presentModalViewController:toPresentViewController animated:YES]; 
}]; 

सिद्धांत रूप में यह माता पिता viewController तक पहुंच दी काम करना चाहिए:

2.) एक बार माता-पिता के लिए उपयोग प्राप्त की है, मैं बस निम्नलिखित कोड लागू कर सकते हैं। मैं ऐसा करने के अन्य तरीकों के लिए खुला हूं।

मानदंड: आपको माता-पिता ViewController में किसी भी कोड को बदलने की अनुमति नहीं है।

उत्तर

11

आपका कोड दिखता है जैसे यह काम करना चाहिए। आप आईओएस 5 उपयोग कर रहे हैं वहाँ एक UIViewController संपत्ति presentingViewController कहा जाता है।

@property(nonatomic, readonly) UIViewController *presentingViewController; 

तो आप इस प्रॉपर्टी का उपयोग अपने नियंत्रक को प्रस्तुत करने वाले व्यू कंट्रोलर प्राप्त करने के लिए कर सकते हैं।

नोट: आईओएस 4 parentViewController में, पेश नियंत्रक पर सेट किया जाएगा, इसलिए यदि आप समर्थन दोनों आईओएस 4 और 5 कर रहे हैं जब आप पहली बार उपयोग करने के लिए जो संपत्ति तय करने के लिए OS संस्करण की जाँच करना होगा। iOS 5 में एप्पल इस तय कर दी है, ताकि parentViewController अब विशेष रूप से निहित दृश्य नियंत्रकों के माता-पिता के लिए प्रयोग किया जाता है (UIViewController दस्तावेज में एक कंटेनर देखें नियंत्रक को लागू करने पर अनुभाग देखें)।

संपादित करें: ब्लॉक के भीतर से self.presentingViewController तक पहुँचने के बारे में: समय ब्लॉक कहा जाता है के द्वारा (बाद मोडल दृश्य नियंत्रक खारिज किया जाता है) presentingViewController संपत्ति शून्य करने के लिए सेट हो सकता है। याद रखें self.presentingViewController ब्लॉक के अंदर संपत्ति जब ब्लॉक निष्पादित किया जाता है, जब यह बनाया गया था के मूल्य देता है कि।इसलिए नहीं कि self चला गया है/बर्खास्त कर दिया (इसे सुरक्षित रूप से ब्लॉक द्वारा बनाए रखा है), लेकिन क्योंकि यह अब प्रस्तुत किया है, इसलिए अपनी presentingViewController अब नहीं के बराबर है

UIViewController* toPresentViewController = [[UIViewController alloc] init]; 
UIViewController* presentingViewController = self.presentingViewController; 
[self dismissViewControllerAnimated:YES completion:^ 
{ 
    [presentingViewController presentModalViewController:toPresentViewController animated:YES]; 
}]; 

यह आवश्यक है: इस के खिलाफ की रक्षा करने के लिए निम्न कार्य करें। presentingViewController कहीं और स्टोर करना आवश्यक नहीं है, स्थानीय चर ठीक है क्योंकि इसे ब्लॉक द्वारा बनाए रखा जाएगा।

+0

यदि मैं इसे सही ढंग से समझता हूं, तो मुझे यह कोड बदलना चाहिए: '[parentViewControllerAccessor presentModalViewController: toPresentViewController एनिमेटेड: हाँ]; 'to' [self.presentingViewController presentModalViewController: croppedPhotoVC एनिमेटेड: हाँ];'। अफसोस की बात है, यह काम नहीं लग रहा है। क्या मैं कुछ गलत समझ रहा हूँ? – Byte

+1

यह शायद इस बात के कारण है कि ब्लॉक कैसे वस्तुओं को बनाए रखते हैं - यह स्वयं को बनाए रखेगा, लेकिन वर्तमान दृश्य नियंत्रक नहीं, इसलिए समय 'स्वयं' को खारिज कर दिया गया है, इस संपत्ति को शून्य पर सेट किया जा सकता है। ब्लॉक के बाहर एक स्थानीय चर के लिए self.presentingViewController सेट करें, फिर उस चर का उपयोग ब्लॉक के भीतर से करें। – jhabbott

+0

यह वही निष्कर्ष है जिसके साथ मैं आया हूं। मुझे ऐसा करने के लिए एक स्थिर चर बनाना पड़ सकता है कि जब 'स्वयं' हटा दिया जाए, तो विधि अभी भी काम करेगी। लेकिन यह एक हैक की तरह दिखता है। – Byte

1

आप इस अधिसूचना के प्रयोग से कर सकता है।

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

[[NSNotificationCenter defaultCenter] postNotificationName:@"dismissModalView" 
                object:nil 
                userInfo:nil]; 

और फिर अपने मॉडल को देखने के अंदर है कि अधिसूचना संभाल:

- (void)viewDidLoad { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(dismissMe:) 
               name:@"dismissModalView" 
               object:nil]; 
} 

- (void)dismissMe:(NSNotification)notification { 
    // dismiss it here. 
} 
+0

मुझे यकीन है कि यह क्या मतलब है लगता नहीं हूँ, मैं स्पष्ट रूप से कहा था, मैं पिछले दृश्य नियंत्रक पर कोड को स्पर्श नहीं कर सकता जो इस दृश्य नियंत्रक को प्रस्तुत करता है। जब तक, मैं यहाँ कुछ गलत समझ रहा हूँ? – Byte

1

iOS5 के लिए समाधान:

-(void)didDismissModalView:(id)sender { 

    // Dismiss the modal view controller 
    int sold=0; 

    if(sold==0){ 

     //Cash_sold.delegate = self; 
     // Cash_sold.user_amount.text=[NSString stringWithFormat:@"%d",somme]; 

     Cash_sold = [[CashSoldview alloc] initWithNibName:@"CashSoldview" bundle:nil]; 
     CGRect fram1 = CGRectMake(200,20,400,400); 
     Cash_sold.view.superview.frame = fram1; 
     Cash_sold.view.frame=fram1; 
     Cash_sold.modalTransitionStyle= UIModalTransitionStyleCoverVertical; 
     Cash_sold.modalPresentationStyle=UIModalPresentationFormSheet; 

     UIViewController* presentingViewController = self.parentViewController; 

     [self dismissViewControllerAnimated:YES completion:^ 
     { 
     [presentingViewController presentModalViewController:Cash_sold animated:YES]; 
     }];  
    } 
} 
1

निम्नलिखित कोड का प्रयास करें: "अपने मॉडल को देखने के अंदर है कि अधिसूचना को संभालने और फिर:"

[self dismissViewControllerAnimated:NO 
         completion:^{ 
    // instantiate and initialize the new controller 
    MyViewController *newViewController = [[MyViewController alloc] init]; 
    [[self presentingViewController] presentViewController:newViewController 
               animated:NO 
               completion:nil]; 
}]; 
+0

बहुत छोटा कोड और अच्छा काम भी .. – svmrajesh