2012-06-22 12 views
10

मैं फॉर्मों का संग्रह बना रहा हूं जिनमें से प्रत्येक में कई फ़ील्ड हैं। कुछ फ़ील्ड UITextField एस हैं जो एक तिथि प्रदर्शित करेंगे। मैंने नामक एक नई कक्षा बनाई है, जो UITextField का वंशज है। जब DatePickerTextField टैप किया गया है तो मुझे नियंत्रण popover में दिखाई देने के लिए नियंत्रण चाहिए।पॉपओवर बनाने के लिए स्टोरीबोर्ड का उपयोग कैसे करें जिसे कोड में उपयोग किया जा सकता है?

मेरा प्रश्न है कि मैं popover को लागू करने के लिए स्टोरीबोर्ड का उपयोग कैसे करूं? जब दृश्य में एक विशिष्ट, दृश्य नियंत्रण होता है तो मैं एक सीगू कर सकता हूं। लेकिन मैं उस दृश्य में एक सामान्य popover का प्रतिनिधित्व कैसे करूं जो मैं किसी भी तत्काल DatePickerTextField से सक्रिय हो सकता हूं जो सक्रिय हो जाता है?

उत्तर

36

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

उसके बाद आप कोड से पॉपओवर बना सकते हैं:

- (IBAction)buttonPressed:(id)sender { 
    UIView *anchor = sender; 
    UIViewController *viewControllerForPopover = 
     [self.storyboard instantiateViewControllerWithIdentifier:@"yourIdentifier"]; 

    popover = [[UIPopoverController alloc] 
       initWithContentViewController:viewControllerForPopover]; 
    [popover presentPopoverFromRect:anchor.frame 
          inView:anchor.superview 
      permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
} 

एक चेतावनी है कि आप संदर्भ पकड़ करने के लिए अपने वर्ग के इवर रूप पॉपओवर करने की जरूरत है, अन्यथा यह दुर्घटना जाएगा क्योंकि UIPopoverController जारी किया गया और बाद में पुनः आवंटित की जाती किया जाएगा buttonPressed रिटर्न:

@interface MyViewController : UIViewController { 
// ... 
    UIPopoverController *popover; 
// ... 
} 
+2

धन्यवाद:

यहाँ स्विफ्ट संस्करण है। वास्तव में मुझे क्या चाहिए। मैं यह देखने के लिए अपना पहला विचार करने जा रहा हूं कि प्रदर्शन के प्रेषक WegueWithIdentifier कॉल एंकर बन जाता है या नहीं। अगर यह काम नहीं करता है तो मैं दूसरे विचार के साथ जाऊंगा। –

2

तो, मैं एक ऐसी ही मुद्दा था, और मामले में अन्य लोगों के लाभ हो सकता है, मैं समझ मैं इसे साझा करना चाहते हैं, के बाद से मैं stackoverflow से इतना लाभ होता है।

यह समाधान आपको एक अनुकूलनशील पॉपओवर segue के एंकर सेट करने की अनुमति देता है। यह आपको सेग्यू को मोडल करने के लिए कॉन्फ़िगर करने की अनुमति देता है या नहीं (मुझे बाहरी संदर्भ को कम करके segue को रोकने का कोई तरीका नहीं मिल सका, इसलिए यदि कोई जानता है कि यह कैसे करना है, तो मुझे यह सुनने में रूचि होगी); यह पॉपओवर नियंत्रक के लिए पासथ्रू दृश्यों को सेट करके पूरा किया जाता है। मैंने स्रोत व्यू कंट्रोलर के दृश्य के बजाय कस्टम व्यू निर्दिष्ट करने की क्षमता भी जोड़ा (क्योंकि मुझे इस क्षमता की आवश्यकता है); यह हिस्सा समाधान के लिए महत्वपूर्ण नहीं है।

DynamicPopoverSegue.h

@interface DynamicPopoverSegue : UIStoryboardPopoverSegue 

@property BOOL isModal; 
@property UIView* sourceView; 
@property CGRect anchor; 

@end 

DynamicPopoverSegue.m

@implementation DynamicPopoverSegue 

- (void)perform 
{ 
    if (!self.popoverController.popoverVisible) 
    { 
     UIViewController* dst = (UIViewController*)self.destinationViewController; 
     UIViewController* src = (UIViewController*)self.sourceViewController; 

     UIView* inView = _sourceView ? _sourceView : src.view; 

     self.popoverController.contentViewController = dst; 
     if (!_isModal) 
     { 
     [self.popoverController setPassthroughViews:[[NSArray alloc] initWithObjects:inView, nil]]; 
     } 
     [self.popoverController presentPopoverFromRect:_anchor 
               inView:inView 
          permittedArrowDirections:UIPopoverArrowDirectionAny 
              animated:YES]; 
    } 
} 

@end 

तो फिर तुम सिर्फ "कस्टम" स्टोरीबोर्ड में करने के लिए अपने segue निर्धारित करते हैं, और segue वर्ग के लिए "DynamicPopoverSegue" की स्थापना की। मेरे मामले में, चूंकि मैं इसे एक दृश्य में गतिशील परतों से जोड़ना चाहता था, इसलिए मैं एंकर सेट नहीं कर सका, इसलिए मैंने व्यू कंट्रोलर के नीचे बार में व्यू कंट्रोलर आइकन से कंट्रोल कंट्रोलर आइकन पर क्लिक करके सीगू बनाया, जो व्यू कंट्रोलर था popupover प्रस्तुत करने के लिए उपयोग कर रहे हैं।

पॉपओवर segue कॉल करने के लिए:

[self performSegueWithIdentifier:@"MyPopoverSegue" sender:self]; 

और पॉपओवर segue कॉन्फ़िगर करने के लिए:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"MyPopoverSegue"]) 
    { 
     DynamicPopoverSegue* popoverSegue = (DynamicPopoverSegue*)segue; 
     // set the anchor to wherever you want it to be 
     popoverSegue.anchor = _destinationFrame; 
    } 
} 
+0

यह मेरे लिए काम नहीं करता है: पॉपओवर दिखाए जाने के बाद, इसके बाहर स्पर्श करें इसे बंद नहीं करना चाहिए – xaphod

0
- (IBAction)pressItemChooseOprateRoom:(id)sender { 
    if (isPad){ 
     // UIView *anchor = sender; 
     UIViewController *viewControllerForPopover = 
     [self.storyboard instantiateViewControllerWithIdentifier:@"OperateRoomList"]; 

     _myPopover = [[UIPopoverController alloc] 
         initWithContentViewController:viewControllerForPopover]; 

     CGRect rc=[self getBarItemRc:sender]; 
     [_myPopover presentPopoverFromRect:rc 
            inView:self.view 
        permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 

     [MLControl shared].popover =self; 
     // [self perfformSegueWithIdentifier:SEGUE_POP_OPERATEROOM sender:self]; 
    }else{ 
     [self iphoneOpenOperateRoomList]; 
     /* [self performSegueWithIdentifier:@"iPhonePushOperateRoom" sender:self]; 
     */ 
    } 
} 

-(void)iphoneOpenOperateRoomList{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"OperateRoomList"]; 
    //  if (!index.showTabBar) { 
    //   vc.hidesBottomBarWhenPushed = YES; 
    //  } 

    [self.navigationController pushViewController:vc animated:YES]; 
} 
0

बस मेरे स्विफ्ट परियोजना के लिए Jonnywho से जवाब का इस्तेमाल किया। मामले में आप इसकी आवश्यकता है:

let anchor: UIView = sender 
    var viewControllerForPopover = self.storyboard?.instantiateViewControllerWithIdentifier("GameAboutViewController") as! UIViewController? 


    let popover = UIPopoverController(contentViewController: viewControllerForPopover!) 
    popover.presentPopoverFromRect(anchor.frame, inView: anchor, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true) 
संबंधित मुद्दे

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