Iphone 使用UIbutton关闭popover

Iphone 使用UIbutton关闭popover,iphone,ipad,Iphone,Ipad,我不明白为什么它不能正常工作,当我试图通过点击一个UIButton来关闭一个popover时,它本身就在一个要关闭的popover上,我的项目崩溃了 - (IBAction) cancelButton: (id) sender{ //[self dismissPopoverAnimated:YES]; } 以上是我的UIButton代码不要将popover从其自身中移除。制定一个协议,向其代理发送消息,然后将其取消。例如,您的popover视图控制器可能如下所示 // MyPopoverVie

我不明白为什么它不能正常工作,当我试图通过点击一个UIButton来关闭一个popover时,它本身就在一个要关闭的popover上,我的项目崩溃了

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

以上是我的UIButton代码

不要将popover从其自身中移除。制定一个协议,向其代理发送消息,然后将其取消。例如,您的popover视图控制器可能如下所示

// 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
//MyPopoverViewController.h
@协议MyPopoverDelegate
-(作废)点击取消按钮;
@结束
@接口MyPopoverViewController:UIViewController{
}
@属性(非原子,赋值)id委托;
-(iAction)取消按钮;
@结束
//MyPopoverViewController.m
#导入“MyPopoverViewController.h”
@MyPopoverViewController的实现
@综合代表;
//指定的初始值设定项。如果以编程方式创建控制器并希望执行不适用于viewDidLoad的自定义,请重写。
/*
//实现viewDidLoad以在加载视图(通常从nib)后执行附加设置。
-(无效)viewDidLoad{
[超级视图下载];
}
*/
-(iAction)取消按钮{
[self.delegate单击取消按钮];
}
#布拉格标记-
#pragma标记旋转支持
-(布尔)应自动旋转指针面定向:(UIInterfaceOrientation)interfaceOrientation{
//覆盖以允许任何方向。
返回YES;
}
#布拉格标记-
#pragma标记内存管理
-(无效)未收到记忆警告{
//如果视图没有superview,则释放该视图。
[超级记忆警告];
//释放所有未使用的缓存数据、图像等。
}
-(无效)视图卸载{
[超级视频下载];
//释放主视图的所有保留子视图。
//例如,self.myOutlet=nil;
}
-(无效)解除锁定{
[super dealoc];
}
@结束
然后你可以用

//  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
//ClassImplementingPopoverController.h
#进口
#导入“MyPopoverViewController.h”
@接口分类实现PopOvercontroller:UIViewController{
UIPopoverController*myPopoverController;
}
@属性(非原子,保留)UIPopoverController*myPopoverController;
@结束
//ClassImplementingPopoverController.m
#导入“ClassImplementingPopoverController.h”
#导入“MyPopoverViewController.h”
@实现类实现PopOvercontroller
@综合超控器;
#布拉格标记-
#pragma标记视图生命周期
-(无效)viewDidLoad{
[超级视图下载];
}
//替代以允许默认纵向方向以外的方向。
-(布尔)应自动旋转指针面定向:(UIInterfaceOrientation)interfaceOrientation{
//对于支持的方向,返回YES。
返回YES;
}
#布拉格标记-
#pragma标记MyPopover委托
-(无效)单击取消按钮{
如果([myPopoverController isPopoverVisible]){
[myPopoverController解除动画化:是];
[myPopoverController释放];
}
}
#布拉格标记-
#pragma标记UIPopoverController委托
-(void)PopOvercontrollerdDismissPopOver:(UIPopoverController*)popoverController{
如果(popoverController==myPopoverController){
[myPopoverController释放];
}
}
/*使用类似这样的方法来创建popover,只需确保将委托设置为self,这样您就可以接收消息
NSLog(@“显示Popover!”);
MyPopoverViewController*detailViewController=[[MyPopoverViewController alloc]initWithNibName:@“MyPopoverViewController”捆绑包:nil];
[detailViewController setDelegate:self];
//将选定对象传递给新的视图控制器。
myPopoverController=[[UIPopoverController alloc]initWithContentViewController:detailViewController];
[详细视图控制器发布];
myPopoverController.popoverContentSize=cSizeMake(500.0,150.0);
[myPopoverController setDelegate:self];
*/
#布拉格标记-
#pragma标记内存管理
-(无效)未收到记忆警告{
//如果视图没有superview,则释放该视图。
[超级记忆警告];
//放弃未使用的任何缓存数据、图像等的所有权。
}
-(无效)视图卸载{
//放弃可在viewDidLoad或按需重新创建的任何内容的所有权。
//例如:self.myOutlet=nil;
self.myPopoverController=nil;
}
-(无效)解除锁定{
[myPopoverController释放];
[super dealoc];
}
@结束

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

VC无法直接访问其封闭的popover;你只需要在创建它的VC中保留一个对它的引用,这样你就可以在那里用dismission点击它

你可以从里面把爆米花去掉,这样就不会崩溃

您可以使用KVC访问“popoverController”,如


但是,如果AppStore检测到您的代码正在使用其“专用API”,它可能会被AppStore拒绝。

崩溃消息是什么(在控制台中查看)?在抛出“NSException”程序接收信号的实例“SIGABRT”后终止调用。(gdb)您的回调是否指定为@selector(cancelButton)并缺少冒号?hai ur ans是对的,它工作得很好感谢@Renegade428您的委托方法不工作..有没有建议我使用xcode 4.3.3
[self valueForKey:@"popoverController"]