2010-08-25 67 views
4

我不明白为什么它不能正常工作,因为它应该当我尝试通过单击一个UIButton来解除弹出窗口,而这个UIButton本身就是一个弹出窗口,我的项目会崩溃。 。使用UIbutton关闭popover

- (IBAction) cancelButton: (id) sender{ 
//[self dismissPopoverAnimated:YES]; 
} 

以上就是我为我的UIButton

+0

什么是崩溃消息(查看控制台)? – 2010-08-25 13:08:34

+0

在抛出'NSException'实例后终止调用 程序接收信号:“SIGABRT”。 (gdb) – awlcs 2010-08-25 15:54:44

+0

您的回调是否指定为@selector(cancelButton)且冒号为空? – ZaBlanc 2010-08-26 09:44:17

回答

19

不要从自身中驳回酥料饼的代码。制定一个协议,向其代表发送消息,然后解除它。例如,你的酥料饼的视图控制器可能是这样的..

// MyPopoverViewController.h 

@protocol MyPopoverDelegate <NSObject> 
-(void)didClickCancelButton; 
@end 

@interface MyPopoverViewController : UIViewController { 

} 

@property (nonatomic, assign) id<MyPopoverDelegate> delegate; 

-(IBAction)cancelButton; 

@end 

// MyPopoverViewController.m 
#import "MyPopoverViewController.h" 

@implementation MyPopoverViewController 

@synthesize delegate; 

// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. 

/* 
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 
*/ 

-(IBAction)cancelButton { 
    [self.delegate didClickCancelButton]; 
} 

#pragma mark - 
#pragma mark Rotation support 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Overriden to allow any orientation. 
    return YES; 
} 

#pragma mark - 
#pragma mark Memory Management 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc. that aren't in use. 
} 


- (void)viewDidUnload { 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 


- (void)dealloc { 
    [super dealloc]; 
} 


@end 

然后你可以使用..

// ClassImplementingPopoverController.h 

#import <UIKit/UIKit.h> 
#import "MyPopoverViewController.h" 

@interface ClassImplementingPopoverController : UIViewController <UIPopoverControllerDelegate, MyPopoverDelegate> { 

    UIPopoverController *myPopoverController; 
} 

@property (nonatomic, retain) UIPopoverController *myPopoverController; 

@end 

// ClassImplementingPopoverController.m 

#import "ClassImplementingPopoverController.h" 
#import "MyPopoverViewController.h" 


@implementation ClassImplementingPopoverController 

@synthesize myPopoverController; 

#pragma mark - 
#pragma mark View lifecycle 


- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 

// Override to allow orientations other than the default portrait orientation. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Return YES for supported orientations. 
    return YES; 
} 

#pragma mark - 
#pragma mark MyPopover delegate 

-(void)didClickCancelButton { 
    if ([myPopoverController isPopoverVisible]) { 
     [myPopoverController dismissPopoverAnimated:YES]; 
     [myPopoverController release]; 
    } 
} 

#pragma mark - 
#pragma mark UIPopoverController delegate 

-(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { 
    if (popoverController == myPopoverController) { 
     [myPopoverController release]; 
    } 
} 

/* Use something like this to create your popover, just make sure you set the delegate to self so you can receive the messages 

     NSLog(@"Displaying Popover!"); 
     MyPopoverViewController *detailViewController = [[MyPopoverViewController alloc] initWithNibName:@"MyPopoverViewController" bundle:nil]; 
     [detailViewController setDelegate:self]; 
     // Pass the selected object to the new view controller.  
     myPopoverController = [[UIPopoverController alloc] initWithContentViewController:detailViewController]; 
     [detailViewController release]; 
     myPopoverController.popoverContentSize = CGSizeMake(500.0, 150.0); 
     [myPopoverController setDelegate:self]; 
*/ 

#pragma mark - 
#pragma mark Memory management 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Relinquish ownership any cached data, images, etc. that aren't in use. 
} 

- (void)viewDidUnload { 
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand. 
    // For example: self.myOutlet = nil; 
    self.myPopoverController = nil; 
} 


- (void)dealloc { 
    [myPopoverController release]; 
    [super dealloc]; 
} 

@end 
+0

hai ur ans是正确的它工作非常好谢谢@ Renegade428 – Rocky 2012-02-02 06:47:42

+0

你的委托方法不工作..任何建议我正在使用xcode 4.3.3 – 2012-07-28 05:57:47

0

dismissPopoverAnimated是在PopoverController本身,而不是您的自定义VC的属性。你正在展示一个关于'自我'的IBAction,这表明你在这里属于你自己的班级。 (如果不正确,请张贴更多周边代码。)

VC无法直接到达其封闭的弹出窗口;你只需要在创建它的VC中保留一个引用,这样你就可以从中删除它。

您可以从内部解散Popover,但不会崩溃。

3

您可以使用KVC访问“popoverController”像

[self valueForKey:@"popoverController"] 

不过,它可能通过AppStore的拒绝,如果他们发现你的代码是使用他们的“私有API”。