ios - चेतावनी: MainTableViewController जो पहले से ही प्रस्तुत कर रहा है(nale) पर ModalTableViewController प्रस्तुत करने का प्रयास



cocoa-touch popover (6)

मुझे एक पॉपओवर की समस्या है। यदि मैं एक सेल पर टैप करता हूं तो अधिक विवरण का चयन करने के लिए मैं एक पॉपओवर लोड करूंगा। सब कुछ ठीक काम करता है, लेकिन जब मैं अपने सेल को फिर से दबाता हूं तो मुझे हर बार निम्न संदेश प्राप्त होता है:

चेतावनी: पेश करने का प्रयास ModalTableViewController ... MainTableViewController पर ... जो पहले से ही प्रस्तुत कर रहा है (अशक्त)

अगर मैं दूसरे सेल पर टैप करता हूं तो मुझे यह वार्निंग नहीं मिलेगी। केवल अगर एक ही पंक्ति को फिर से टैप करें।

मैंने बहुत सी चीजों की कोशिश की लेकिन मैं इस समस्या को हल करने में सक्षम नहीं हूं। मैं अपनी आबादी को इस तरह से लोड करता हूं:

var popover: UIPopoverController!
var popoverContent: ModalTableViewController!

और मेरे सेल टैप पर:

popoverContent = self.storyboard.instantiateViewControllerWithIdentifier("ModalTableViewController") as ModalTableViewController

popoverContent.selectedQuestionID = indexPath!.row               
popover = UIPopoverController(contentViewController: popoverContent)
popover.delegate = self

popover.presentPopoverFromRect(currentCell.LabelCellTitle.frame, inView: currentCell.LabelCellTitle.superview, permittedArrowDirections: UIPopoverArrowDirection.Left, animated: true)

और खारिज करने के लिए

func popoverControllerDidDismissPopover(popoverController: UIPopoverController!) {

    popover.dismissPopoverAnimated(false) // just to check

    self.popover = nil
    self.popoverContent = nil

}

कोई विचार?

संपादित करें:

अगर मैं जाँच करूँ:

if(self.popoverContent == nil) {

इसे खोलने से पहले, मुझे पता चलेगा कि जब मैं एक ही सेल को फिर से टैप करता हूं तो यह शून्य नहीं होता है।

फिर से संपादित करें:

अगर मैं इसे थोड़ा अलग सेटअप के साथ बनाऊं तो मुझे एक ही समस्या है:

कस्टम 1x1px बटन। पॉपओवर को segue से कनेक्ट करें। सेल टैप मूव बटन टू सेल और ओपन पॉपओवर।

तो पॉपओवर को खोलने के लिए कोई कोड नहीं है, केवल स्टोरीबोर्ड संपादक के साथ।

मुझे एक ही त्रुटि संदेश मिलता है (कभी-कभी) बस अगर मैं फिर से वही पॉपओवर टैप करता हूं।

https://ffff65535.com


आसानी से इस कोड स्निपेट को अपने मुख्य uiviewcontroller के ViewDidLoad() में जोड़ें

 definesPresentationContext = true

ऐसा लगता है कि यह एक पॉपओवर पर कुछ भी प्रस्तुत करने के बारे में सच है। पिछले सभी प्रतिक्रियाओं के कार्य करने की संभावना है क्योंकि पॉपओवर (या गतिविधि शीट, या समान) से पहले जो भी कार्रवाई की जा रही है वह खारिज कर दी गई है।

यदि आप कर सकते हैं, तो पहले पॉपओवर को खारिज करने का प्रयास करें, फिर अपना मोडल प्रस्तुत करें।


मेरे मामले में, मैं गलती से अपने बटन को IBAction और Storyboard Segue में एक ही समय में Present As Popover साथ लिंक करता हूं। इसे ठीक करने के लिए मैंने अपने बटन को Touch Up Inside इवेंट लिंक को IBAction से हटा दिया और केवल Storyboard Segue उपयोग किया।


मेरे लिए, यह तब हुआ जब मेरे पास एक नेविगेशनटाइम के हिस्से के रूप में दो UIBarButton आइटम थे और दोनों के पास अपने स्वयं के नियंत्रकों के साथ - पॉपओवर के रूप में विचारों को खोलने के लिए एक ट्रिगर बहस थी। एक पॉपओवर स्वचालित रूप से खारिज नहीं करेगा जब दूसरे BarButtonItem का दोहन होगा। हालाँकि यह तब खारिज होगा जब मैंने पॉपओवर के बाहर कहीं और टैप किया था। मैंने UINavigationController को ओवरराइड किया और presentViewController:animated:completion एक विस्तारित संस्करण को presentViewController:animated:completion

/*
 * Workaround for apparent bug in iPad that popover does not automatically dismiss if another bar button item is pressed
 */

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {

    /*
     * Make sure this runs in the main queue
     */
    dispatch_async(dispatch_get_main_queue(), ^ {
        if (
            [self.presentedViewController isKindOfClass:[ViewController1 class]]
            || [self.presentedViewController isKindOfClass:[ViewController2 class]]
            || [self.presentedViewController isKindOfClass:[ViewController3 class]]
            || [self.presentedViewController isKindOfClass:[ViewController4 class]]
            ) {
            [self dismissViewControllerAnimated:YES completion:^{
                [super presentViewController:viewControllerToPresent animated:flag completion:completion];
            }];
        }

        else {
            [super presentViewController:viewControllerToPresent animated:flag completion:completion];
        }
    });
}

मेरा मानना ​​है कि dispatch_async(dispatch_get_main_queue(), ^ {}) वास्तव में आवश्यक नहीं है, मैंने सिर्फ एहतियात के रूप में इसे जोड़ा।


यह तब होता है जब एक UIActionSheet नए दृश्य नियंत्रक प्रस्तुति कॉल के क्षण में प्रस्तुत किया जाता है, उदाहरण के लिए यह कोड मेरे लिए काम करता है

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        [controller presentViewController:modalViewController animated:YES completion:NULL];
    }];

यह भी काम करेगा:

dispatch_async(dispatch_get_main_queue(), ^ {
        [self presentViewController:vc animated:YES completion:nil];
});




popover