0

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

有什么帮助吗?谢谢!

这是我的代码:

视图控制器.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

视图控制器.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

表视图控制器.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

表视图控制器.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
4

3 回答 3

1

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

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

-(void)dismissPopover {
    [pop dismissPopoverAnimated:YES];
}
于 2012-08-10T15:04:35.760 回答
1

在您当前的工作流程中,ViewControllerTableViewController. 看起来您正在呈现UITableViewController来自而UIPopoverIphone不是来自ViewController. 所以委托回调方法dismissPopover需要在UIPopoverIphone类而不是ViewController类中实现。如果您仍想UIPopoverIphone从中解散ViewController,有两种选择:

  1. 使用NSNotificationCenter:在 中TableViewController,您可以在准备好关闭弹出框时发布通知。然后在 中ViewController,您可以观察该通知并关闭弹出框。在这种情况下,不涉及任何委托。

  2. UIPopoverIphone从您的班级和班级设置委托回调ViewController。因此,当您点击弹出窗口中的按钮时,它会回调ViewController,然后您关闭弹出窗口并准备好TableViewController并呈现它。在这里你TableViewController和你ViewController有联系。

于 2012-08-10T16:27:49.500 回答
0

默认情况下,当检测到点击超出其范围时,弹出框会自行关闭。

于 2012-08-10T15:06:48.743 回答