如何从其他视图中解除Popover?

时间:2012-08-10 14:53:34

标签: ios uipopovercontroller popover dismiss

我遇到这样的问题: 我有一个根视图,它有一个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

ViewController.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

TableViewController.h

#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.m

#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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

根据您当前的工作流程,ViewControllerTableViewController无关。您好像是在展示UITableViewController中的UIPopoverIphone而不是ViewController。因此,委托回调方法dismissPopover需要在UIPopoverIphone类而不是ViewController类中实现。如果您仍想从UIPopoverIphone中删除ViewController,则有两种选择:

  1. 使用NSNotificationCenter:在TableViewController中,您可以在准备好解除弹出窗口时发布通知。然后在ViewController中,您可以观察该通知并解除弹出窗口。在这种情况下,不涉及任何代表。

  2. UIPopoverIphone班级和ViewController班级设置代理回调。因此,当您点击弹出窗口中的按钮时,它会回拨ViewController,然后您将解除弹出框并准备好TableViewController并显示它。您TableViewControllerViewController有联系。

答案 2 :(得分:0)

默认情况下弹出窗口会在超出界限的情况下检测到点击时自行解除。