我遇到这样的问题: 我有一个根视图,它有一个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
答案 0 :(得分:1)
您的根视图ViewController
似乎无法正确实现您的TableViewPopoverDelegate
。您已在该委托中声明了一个名为dismissPopover
的方法,但您尚未在ViewController.m中实现该方法。
在ViewController.m中,将hidePop函数更改为:
-(void)dismissPopover {
[pop dismissPopoverAnimated:YES];
}
答案 1 :(得分:1)
根据您当前的工作流程,ViewController
与TableViewController
无关。您好像是在展示UITableViewController
中的UIPopoverIphone
而不是ViewController
。因此,委托回调方法dismissPopover
需要在UIPopoverIphone
类而不是ViewController
类中实现。如果您仍想从UIPopoverIphone
中删除ViewController
,则有两种选择:
使用NSNotificationCenter
:在TableViewController
中,您可以在准备好解除弹出窗口时发布通知。然后在ViewController
中,您可以观察该通知并解除弹出窗口。在这种情况下,不涉及任何代表。
从UIPopoverIphone
班级和ViewController
班级设置代理回调。因此,当您点击弹出窗口中的按钮时,它会回拨ViewController
,然后您将解除弹出框并准备好TableViewController
并显示它。您TableViewController
和ViewController
有联系。
答案 2 :(得分:0)
默认情况下弹出窗口会在超出界限的情况下检测到点击时自行解除。