2013-02-08 6 views
15

मेरे पास एक बटन है जिसे मैंने व्यू कंट्रोलर के भीतर प्रोग्रामेटिक रूप से बनाया है। एक बार बटन दबाए जाने के बाद, मैं इसे प्रोग्रामर रूप से पॉपओवर बनाने के लिए एक विधि का उपयोग करना चाहता हूं।एक यूबूटटन से प्रोग्रामेटिक रूप से पॉपअप को प्रदर्शित करने के लिए जो प्रोग्रामेटिक रूप से बनाया गया है (इंटरफ़ेस बिल्डर का उपयोग नहीं कर रहा है)

बटन जो मेरे विचार controller.m

UIView *moreFundInfoView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 540, 620)]; 
[self.view addSubview:moreFundInfoView]; 
[moreFundInfoView setBackgroundColor:[UIColor RMBColor:@"b"]]; 

btnContact = [UIButton buttonWithType:(UIButtonTypeRoundedRect)]; 


[btnContact setFrame:CGRectMake(390, 575, contactButton.width, contactButton.height)]; 
btnContact.hidden = NO; 
[btnContact setTitle:@"Contact" forState:(UIControlStateNormal)]; 
[moreFundInfoView addSubview:btnContact]; 

[btnContact addTarget:self action:@selector(showContactDetails:) forControlEvents:UIControlEventTouchUpInside]; 

में viewDidLoad में बन जाता है तब मैं विधि जब बटन दबाया जाता है मैं का उपयोग कर सकते है।

-(void) showContactDetails: (id) sender 
{ 
UIViewController *popoverContent = [[UIViewController alloc]init]; 

UIView *popoverView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 200, 300)]; 

[popoverView setBackgroundColor:[UIColor RMBColor:@"b"]]; 

popoverContent.view = popoverView; 

popoverContent.contentSizeForViewInPopover = CGSizeMake(200, 300); 

UIPopoverController *contactPopover =[[UIPopoverController alloc] initWithContentViewController:popoverContent]; 

[contactPopover presentPopoverFromRect:btnContact.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES ]; 

[contactPopover setDelegate:self]; 

}

मैं यहाँ क्या याद आ रही है? क्योंकि यह ठीक चलता है, लेकिन जैसे ही मैं बटन क्लिक करता हूं ऐप क्रैश हो जाता है। मुझे लगता है कि यह एक प्रतिनिधि मुद्दा है, लेकिन मुझे यकीन नहीं है। किसी भी सलाह की सराहना की जाएगी।

+1

क्या आप हमें क्रैश लॉग दे सकते हैं? यह जानने में मदद करेगा कि समस्या –

+0

@ValentinRocher अभी भी एक n00b का थोड़ा सा है, लेकिन यह क्रैश होने पर आउटपुट है। ऐपनाम- [UIPopoverController dealloc] पॉपओवर अभी भी दिखाई देने पर पहुंच गया ./-[UIPopoverController dealloc] पॉपओवर अभी भी दिखाई दे रहा है। – Berns

+0

हाय मैं इसे ठीक करने में कामयाब रहा, ठीक है, वैसे भी। मैंने अभी UIPopoverController की संपत्ति को मजबूत करने के लिए बदल दिया है और यह काम करता है, बस यह ऊपर की ओर इशारा करता है, लेकिन यह कम से कम प्रदर्शित करता है और ऐप क्रैश नहीं होता है। – Berns

उत्तर

1

मुझे बस इतना करना था कि .h फ़ाइल में "retain" से "strong" तक संपत्ति को बदल दिया गया था और यह काम करता है, ऐप को क्रैश होने से रोक दिया।

+4

यदि यह आपके मुद्दे को ठीक कर रहा है, तो आप अपना उत्तर स्वीकार कर सकते हैं। – Vineeth

32

मुझे लगता है कि यह कोड आपकी मदद करेगा। आप निश्चित रूप से याद कर रहे हैं प्रतिनिधि तरीकों

ViewController *viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; 
UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navigationController]; 
popover.delegate = self; 
popover.popoverContentSize = CGSizeMake(644, 425); //your custom size. 
[popover presentPopoverFromRect:button.frame inView:self.view permittedArrowDirections: UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionUp animated:YES]; 

बस सुनिश्चित करें कि आप भूल नहीं कर रहे हैं UIPopover प्रतिनिधि तरीकों वरना आवेदन निश्चित रूप से दुर्घटना होगा। यह जरूरी है।

+3

UINavigationController का उपयोग पूरी तरह से वैकल्पिक है। आप अपनी वस्तु के निर्माण को छोड़ सकते हैं। सिर्फ जानकारी के लिए। एक खुश कोडिंग है। –

1

हां, "रखरखाव" के लिए "मजबूत" के लिए संपत्ति बदलना आपको अपने पिकर व्यू ऑब्जेक्ट को पकड़ने के लिए बनाता है। मुझे लगता है कि आपके कोड के साथ समस्या थी, विधि समाप्त होने पर UIPopoverController ऑब्जेक्ट स्वचालित रूप से हटा दिया जाता है। मजबूत संपत्ति बनाने से आप दृढ़ता से किसी ऑब्जेक्ट को इंगित कर सकते हैं।

2
UIViewController *controller = [[UIViewController alloc] init]; 
[view removeFromSuperview]; //view is a view which is displayed in a popover 
controller.view = view; 
UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:controller]; 
popover.delegate = self; 
[popover presentPopoverFromRect:button.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES]; 
संबंधित मुद्दे