2012-06-10 15 views
11

का उपयोग करके पॉपओवर को खारिज कर रहा है मैंने इस पर सामान के टन पढ़ा है और अधिकांश गैर-स्टोरीबोर्ड दृष्टिकोण के संबंध में प्रतीत होता है, मैंने सोचा कि मैंने एक साथ बिट्स पाई हैं और इसे समझ लिया है। हालांकि, निम्नलिखित कोड का परिणाम मेरे पॉपओवर को खारिज नहीं किया जा रहा है। पॉपओवर निष्पादित बटन में खारिजपोप बटन बटन दबाया जाता है लेकिन प्रतिनिधि में बर्खास्तपॉप विधि में ब्रेकपॉइंट कभी हिट नहीं होता है। गलतियों को पहचानने के लिए कोड पर नजर डालने वाले किसी की भी बहुत सराहना करेंगे।स्टोरीबोर्ड: प्रतिनिधि/प्रोटोकॉल विधि

धन्यवाद

निम्नलिखित में, NewGameViewController एक UIButton शामिल हैं। इस परिणाम को पॉपओवर सेगु में और पॉपव्यू कंट्रोलर UIView युक्त पॉपओवर के बाद के प्रदर्शन में दबाएं।

NewGameViewController.h

#import "PopViewController.h" 
@interface NewGameViewController: UIViewController <DismissPopoverDelegate> 
{ 
    UIPopoverController *popover; 
} 

NewGameViewController.m

@implementation NewGameViewController 
-(void)prepareForSegue:(UIStoryboardPopoverSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"popoverSegue"]) 
    { 
     popover = [(UIStoryboardPopoverSegue *)segue popoverController]; 
     // getting warning: Assigning to 'id<UIPopoverControllerDelegate>' from incompatible type 'NewGameViewController *const__strong' 
     //popover.delegate = self; 
    } 
} 

-(void)dismissPopover 
{ 
    [popover dismissPopoverAnimated:YES]; 
} 

PopViewController.h

@protocol DismissPopoverDelegate <NSObject> 
-(void) dismissPopover; 
@end 

@interface PopViewController: UIViewController 
{ 
    __unsafe_unretained id<DismissPopoverDelegate> delegate; 
} 

@property (nonatomic, assign) id<DismissPopoverDelegate> delegate; 
-(IBAction)dismissPopoverButtonPressed:(id)sender; 
@end 

PopViewController.m

#import "NewGameViewController.h" 
@implementation PopViewController 
@synthesize delegate; 
-(IBAction)dismissPopoverButtonPressed:(id)sender 
{ 
    [self.delegate dismissPopover]; 
} 

उत्तर

13

जब एक स्टोरीबोर्ड segue से एक पॉपओवर नियंत्रक को जोड़ने, segue की popoverController संपत्ति एक मानक UIPopoverController को दर्शाता है। इस नियंत्रक के पास एक संपत्ति है, contentViewController, जो वास्तव में पॉपओवर के भीतर प्रस्तुत किया जा रहा दृश्य नियंत्रक का प्रतिनिधित्व करेगा, आपके मामले में PopViewController

तो, आपका वर्तमान कोड पॉपओवर नियंत्रक के प्रतिनिधि के रूप में खुद को स्थापित कर रहा है, जब इसे वास्तव में पॉपओवर की सामग्री देखें नियंत्रक के प्रतिनिधि के रूप में स्थापित करने की आवश्यकता है।

-(void)prepareForSegue:(UIStoryboardPopoverSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"popoverSegue"]) 
    { 
     popover = [(UIStoryboardPopoverSegue *)segue popoverController]; 
     // Get a reference to the content view controller of the popover 
     PopViewController *popVC = (PopViewController*)popover.contentViewController; 
     // Set ourselves as the content VC's delegate 
     popVC.delegate = self; 
    } 
} 
+0

धन्यवाद:

आप अभी भी चारों ओर पॉपओवर नियंत्रक के लिए एक संदर्भ रखने के लिए, को बर्खास्त करने, इसलिए अपने मौजूदा कोड रखने के लिए, लेकिन निम्न परिवर्तन करने की जरूरत है। मुझे स्वीकार करना होगा, मैंने इस कोड को तर्क को पूरी तरह से समझने के लिए लागू नहीं किया है, लेकिन मुझे प्रोटोकॉल और प्रतिनिधि को स्पष्ट रूप से घोषित करने के बारे में कई टिप्पणियां पढ़ने को याद है ताकि पॉपओवर घटनाओं को वीसी में संभाला जा सके जो इसे उत्पन्न करता है। निश्चित रूप से, स्टॉपबोर्ड के माध्यम से कोड बनाम में पॉपओवर स्पष्ट रूप से बनाया जा रहा है या नहीं, इस दृष्टिकोण के आधार पर दृष्टिकोण अलग-अलग दिखाई देते हैं। इसके साथ ही, मैं अभी भी उपरोक्त पर कोई बुद्धिमान नहीं हूँ। – Tony

+0

मैंने सुझावों को रोकने के लिए 'प्रतिनिधि' का नाम बदलने का भी प्रयास किया जैसा कि आप सुझाव देते हैं लेकिन इससे कोई फर्क नहीं पड़ता। जब आप कहते हैं कि मेरा पॉपओवर इवर अधिक विशेष रूप से टाइप किया जाना चाहिए - आपका क्या मतलब है? – Tony

+0

यदि SHARRP यह देख रहा है, तो क्या आप एक उदाहरण प्रोजेक्ट बनाने के लिए बहुत दयालु होंगे (जैसा कि आपने http://stackoverflow.com/questions/5922254/how-to-dismiss-uipopover-from-a- बटन-इन-द-पॉपओवर) जो वही काम करता है लेकिन स्टोरीबोर्ड का उपयोग करता है (यानी, UIViewController के लिए एक सेग्यू को नियंत्रित करना, जिसका दृश्य पॉपओवर के अंदर दिखाई देगा)। उपरोक्त मेरा कोड आपके उदाहरण को लागू करने का प्रयास था, लेकिन कुछ सही नहीं है और स्टोरीबोर्ड/सेगु का उपयोग मुख्य अंतर प्रतीत होता है। – Tony

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