2012-07-09 12 views
13

के लिए पुश मैं सिर्फ अगर यह एक ViewController के लिए पुश करने के लिए सही होने के बाद मैं एक को खारिज कर दिया हो सकता है सोच रहा हूँ।dismissViewControllerAnimated: पूरा होने: एक और ViewController

मैं इस के साथ की कोशिश कर दिया गया है:

 -(void)dismiss{ 
    //send information to database here 

    [self dismissViewControllerAnimated:YES completion:^{ 
        NSLog(@"Dismiss completed"); 
        [self pushtoSingle:post_id]; 
       }]; 
} 

-(void)pushtoSingle:(int)post_id{ 
    Single1ViewController *svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SingleView"]; 
    svc.post_id = post_id; 
    svc.page = 998; 
    [self.navigationController pushViewController:svc animated:YES]; 
} 

और यह:

-(void)dismiss{ 

//send information to database here 

[self dismissViewControllerAnimated:YES completion:^{ 
        NSLog(@"Dismiss completed"); 
        Single1ViewController *svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SingleView"]; 
        svc.post_id = post_id; 
        svc.page = 998; 
        [self.navigationController pushViewController:svc animated:YES]; 
       }]; 
} 

लेकिन कोई सफलता के साथ। दृश्य सफलतापूर्वक खारिज कर दिया गया है लेकिन पुश कभी शुरू नहीं हुआ है .. क्या समस्या के आसपास कोई और ज्ञात तरीका है?

उत्तर

28

हां, मैं यह समझ से बाहर। मैं बस .. एक सूचना पोस्ट किए जाने के बाद मैं एक करने के लिए ViewController बी को खारिज कर दिया और उसके बाद एक में सूचना प्राप्त हुई है और सी को धक्का दे बी में

नकारने:

[self dismissViewControllerAnimated:YES completion:^{ 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"pushToSingle" object:nil userInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:post_id1] forKey:@"post_id"]]; 
}]; 

एक में प्राप्त करना:

-(void)viewWillAppear:(BOOL)animated{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pushToSingle:) name:@"pushToSingle" object:nil]; 
} 

-(void)pushToSingle:(NSNotification *)notis{ 
    NSDictionary *dict = notis.userInfo; 
    int post_id = [[dict objectForKey:@"post_id"] intValue]; 

    NSLog(@"pushing to single"); 
    Single1ViewController *svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SingleView"]; 
    svc.post_id = post_id; 
    svc.page = 998; 
    [self.navigationController pushViewController:svc animated:YES]; 

} 

धन्यवाद, जैकी बॉय!

+0

महान उत्तर ... बस यह जोड़ना अच्छा लगेगा कि यह करना एक अच्छा विचार है –

1

एनीमेशन बाहर ले। इस तरह:

[self dismissViewControllerAnimated:NO completion:^{ 
       NSLog(@"Dismiss completed"); 
       [self pushtoSingle:post_id]; 
      }]; 

मैं ऐसे मामलों में जहां कई एनिमेशन अजीब व्यवहार बनाने होता था।

संपादित 1.0:

इस प्रयास करें:

[self performSelector:@selector(pushtoSingle:) withObject:post_id afterDelay:0.3]; 

संपादित 2.0:

अभी नोटिस ... आप अपने UIViewController खारिज कर रहे हैं और आप एक पुश करने के लिए कोशिश कर रहे हैं आपकी बस से खारिज UIViewController से नया। सिद्धांत, यहाँ में:

[self dismissViewControllerAnimated:YES completion:^{ 
        NSLog(@"Dismiss completed"); 
        [self pushtoSingle:post_id]; 
       }]; 

अपनी पूर्णता को ब्लॉक पर, self, नहीं के बराबर हो जाएगा, क्योंकि आप बस इसे खारिज। वर्तमान UIViewController से नए UIViewController को पुश करें। उदाहरण के लिए, यदि आपके वर्तमान UIViewController बी है:

A -> B 

के बाद खारिज:

A 

पुश नया:

A -> C 
+0

नहीं, यह नहीं किया। पुश एनीमेशन को बंद करने की कोशिश की लेकिन उसने ऐसा नहीं किया। – 278204

+0

मेरा संपादन 1.0 देखें। – Peres

+0

नहीं, मुझे pushtoSingle से एक लॉग संदेश मिलता है लेकिन यह धक्का नहीं देगा। मैंने पूरा करने के ब्लॉक के बाहर और अंदर दोनों प्रदर्शन चयनकर्ता की कोशिश की .. – 278204

0

यह सिर्फ जवाब में जोड़ने से ऊपर robot6 द्वारा प्रस्तुत प्रदान की अधिक है।

आप एक बच्चे को देखने के क्या तुम सच में भी विचार करना चाहिए जोड़ने जनक दृश्य में निम्नलिखित के साथ-साथ नए दृश्य जोड़ने के लिए जा रहे हैं।

-(void)viewDidDisappear:(BOOL)animated{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 

} 

मेरे मामले में मैं सूचनाएं NSDictionary.Then मैं AlertView स्वीकार करने के बाद फिर से वही बच्चे दृश्य पेश किया गया था के माध्यम से पारित पूर्णांक के आधार पर एक AlertView लॉन्च कर रहा था वापस।

-(void)pushToSingle:(NSNotification *)notis{  
NSDictionary *dict = notis.userInfo; 
     int post_id = [[dict objectForKey:@"post_id"] intValue]; 
     NSLog(@"%d", post_id); 


     if (post_id == 1) { 
      UIAlertView *alert = [[UIAlertView alloc] 

            initWithTitle:@"Sign Up" 
            message:@"Are you sure you want to cancel?" 
            delegate:self 
            cancelButtonTitle:@"Cancel" 
            otherButtonTitles: @"Accept", nil]; 
      alert.tag = 1; 
      post_id = 4; 
      [alert show]; 
     } 
} 

क्या हो रहा था।

Alert from parent view in child view

तो, इसके बाद के संस्करण के माध्यम से जवाब मुझे पता चला कि मूल रूप से कुछ भी आप दृश्य 1 में क्या रूप में आप NSNotification पर्यवेक्षक और कभी नहीं हटाया अपने बच्चे को ध्यान में रखते हुए फिर से जाना होगा, जैसे कि यह अपने माता पिता के दृश्य पर अभी भी था पर्यवेक्षक अभी भी सक्रिय है।

अब यह सभी के लिए समस्याएं नहीं पैदा कर सकता है लेकिन अगर आपको वास्तव में इसकी आवश्यकता नहीं है तो एआरसी पर्यवेक्षक को तब तक जारी नहीं करेगा जब तक कि मूल दृश्य अब सक्रिय न हो या जब तक आप इसे अपने viewDidDisapper में ऐसा करने के लिए न कहें

0

श्रेणी:

class Category { 
    var name: String = "" 
} 

FirstViewController:

class FirstViewController: UIViewController { 

    func addNewCategory() { 
     let category = Category() 

     let secondViewController = SecondViewController(category: category) 

     secondViewController.didCreateCategory = { (category: Category) in 
      let thirdViewController = ThirdViewController(category: category) 
      self.navigationController?.pushViewController(thirdViewController, animated: true) 
     } 

     let secondNavigationController = UINavigationController(rootViewController: secondViewController) 
     presentViewController(secondNavigationController, animated: true, completion: nil) 
    } 

} 

SecondViewController:

class SecondViewController: UIViewController { 

    @IBOutlet weak var categoryNameTextField: UITextField! 
    var didCreateCategory: ((category: Category) ->())? 
    var category: Category 

    init(category: Category) { 
     self.category = category 
     super.init(nibName: nil, bundle: nil) 
    } 

    convenience required init(coder aDecoder: NSCoder) { 
     self.init(coder: aDecoder) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Add, 
      target: self, action: "createCategory") 
    } 

    func createCategory() { 
     dismissViewControllerAnimated(true, completion: { 
      self.category.name = self.categoryNameTextField.text 
      self.didCreateCategory!(category: self.category) 
     }) 
    } 

} 

ThirdViewController:

class ThirdViewController: UIViewController { 
    var category: Category 

    init(category: Category) { 
     self.category = category 
     super.init(nibName: nil, bundle: nil) 
    } 

    convenience required init(coder aDecoder: NSCoder) { 
     self.init(coder: aDecoder) 
    } 
} 
संबंधित मुद्दे