Ios 我如何从另一个视图中删除Popover?

Ios 我如何从另一个视图中删除Popover?,ios,uipopovercontroller,popover,dismiss,Ios,Uipopovercontroller,Popover,Dismiss,我有这样一个问题: 我有一个根视图,它有一个UIPopoverController和一个按钮,当我点击该按钮时,它显示一个tableView。我的应用程序显示正常,但现在当我单击任意一行时,UIPopoverController仍会显示,我希望它关闭 有什么帮助吗?谢谢 这是我的代码: ViewController.h #import <UIKit/UIKit.h> #import "UIPopoverIphone.h" #import "TableViewController.h"

我有这样一个问题: 我有一个根视图,它有一个UIPopoverController和一个按钮,当我点击该按钮时,它显示一个tableView。我的应用程序显示正常,但现在当我单击任意一行时,UIPopoverController仍会显示,我希望它关闭

有什么帮助吗?谢谢

这是我的代码:

ViewController.h

#import <UIKit/UIKit.h>
#import "UIPopoverIphone.h"
#import "TableViewController.h"

@interface ViewController : UIViewController <UIPopoverControllerDelegate, TableViewPopoverDelegate> {
    TableViewController *popoverView;
    IBOutlet UIButton *popButton;
    UIPopoverController *pop;
}

@property (strong, nonatomic) UIPopoverController *pop;

+(void)hidePop;
@end
#import <UIKit/UIKit.h>

@protocol TableViewPopoverDelegate <NSObject>

-(void) dismissPopover;

@end

@interface TableViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource> {
    NSMutableArray *itemsArray;
    UITableView *tableView;
    id<TableViewPopoverDelegate> delegate;
}

@property (nonatomic, retain) NSArray *itemsArray;
@property (nonatomic, retain) UITableView *tableView;
@property (nonatomic, assign) id<TableViewPopoverDelegate> delegate;

@end
TableViewController.h

#import <UIKit/UIKit.h>
#import "UIPopoverIphone.h"
#import "TableViewController.h"

@interface ViewController : UIViewController <UIPopoverControllerDelegate, TableViewPopoverDelegate> {
    TableViewController *popoverView;
    IBOutlet UIButton *popButton;
    UIPopoverController *pop;
}

@property (strong, nonatomic) UIPopoverController *pop;

+(void)hidePop;
@end
#import <UIKit/UIKit.h>

@protocol TableViewPopoverDelegate <NSObject>

-(void) dismissPopover;

@end

@interface TableViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource> {
    NSMutableArray *itemsArray;
    UITableView *tableView;
    id<TableViewPopoverDelegate> delegate;
}

@property (nonatomic, retain) NSArray *itemsArray;
@property (nonatomic, retain) UITableView *tableView;
@property (nonatomic, assign) id<TableViewPopoverDelegate> delegate;

@end
#导入
@协议表ViewPopOverdelegate
-(无效)解除职务;
@结束
@接口TableViewController:UITableViewController{
NSMutableArray*项目数组;
UITableView*表格视图;
id代表;
}
@属性(非原子,保留)NSArray*itemsArray;
@属性(非原子,保留)UITableView*tableView;
@属性(非原子,赋值)id委托;
@结束
TableViewController.m

#import "ViewController.h"

@implementation ViewController
@synthesize pop;

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

-(IBAction)showPop {
    popoverView = [[TableViewController alloc] init];
    popoverView.delegate = self;
    pop = [[UIPopoverController alloc] initWithContentViewController:popoverView];
    [pop setPopoverContentSize:CGSizeMake(100, 200)];
    [pop setDelegate:self];
    [pop presentPopoverFromRect:popButton.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}


-(void)hidePop {
    [pop dismissPopoverAnimated:YES];
}

....

@end
#import "TableViewController.h"

@implementation TableViewController


@synthesize itemsArray;
@synthesize tableView;


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

-(void)loadView {
    UIView *mainView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 200)];
    self.view = mainView;
    [mainView release];

    self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 100, 200) style:UITableViewStylePlain];
    self.tableView.delegate   = self;
    self.tableView.dataSource = self;
    [self.view addSubview:self.tableView];
}

....

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
    /*
     <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
     [self.navigationController pushViewController:detailViewController animated:YES];
     [detailViewController release];
     */
    NSLog(@"%@",[self.itemsArray objectAtIndex:indexPath.row]);
    [self.delegate dismissPopover];
}

@end
#导入“TableViewController.h”
@TableViewController的实现
@合成沙雷;
@综合桌面视图;
-(无效)解除锁定{
[项目发布];
[tableView发布];
[super dealoc];
}
-(void)负荷视图{
UIView*mainView=[[UIView alloc]initWithFrame:CGRectMake(0,0,100,200)];
self.view=mainView;
[主视图发布];
self.tableView=[[UITableView alloc]initWithFrame:CGRectMake(0,0,100,200)style:UITableViewStylePlain];
self.tableView.delegate=self;
self.tableView.dataSource=self;
[self.view addSubview:self.tableView];
}
....
#pragma标记-表视图委托
-(void)tableView:(UITableView*)tableView未选择RowatineXpath:(NSIndexPath*)indexPath
{
//导航逻辑可能位于此处。创建并推送另一个视图控制器。
/*
*detailViewController=[[alloc]initWithNibName:@“bundle:nil];
// ...
//将选定对象传递给新的视图控制器。
[self.navigationController pushViewController:detailViewController动画:是];
[详细视图控制器发布];
*/
NSLog(@“%@,[self.itemsArray objectAtIndex:indexath.row]);
[self.delegate dismissPopover];
}
@结束

您的根视图
ViewController
似乎没有正确实现您的
TableViewPopoverDelegate
。您已经在该委托中声明了一个名为
dismissPopover
的方法,但尚未在ViewController.m中实现它

在ViewController.m中,将hidePop函数更改为:

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

默认情况下,当检测到超出其边界的点击时,弹出窗口将自动关闭。

对于当前的工作流程,
ViewController
TableViewController
没有连接。看起来您是从
uipooveriphone
而不是从
ViewController
显示
UITableViewController
。因此,委托回调方法
dismissPopover
需要在
uipopopoveriphone
类中实现,而不是在
ViewController
类中实现。如果仍要从
ViewController
关闭iPhone上的
UIPopoverIphone
,有两个选项:

  • 使用
    NSNotificationCenter
    :在
    TableViewController
    中,您可以在准备关闭popover时发布通知。然后在
    ViewController
    中,您可以观察到该通知并关闭popover。在此场景中,不涉及任何委托

  • 从您的
    uipoveriphone
    类和
    ViewController
    类设置代理回调。因此,当您点击弹出窗口中的按钮时,它会回调到
    ViewController
    ,然后关闭弹出窗口,准备
    TableViewController
    并显示它。这里您的
    TableViewController
    ViewController
    有一个连接


  • 好的,我知道,但我想通过选择它所显示的tableView的行来消除它