0

このような問題があります。UIPopoverControllerとボタンを持つルートビューがあり、そのボタンをクリックすると、tableViewが表示されます。アプリの表示はOKですが、いずれかの行をクリックしても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
4

3 に答える 3

1

ルートビューViewControllerがを正しく実装していないようTableViewPopoverDelegateです。そのデリゲートでと呼ばれるメソッドを宣言しましたがdismissPopover、ViewController.mに実装していません。

ViewController.mで、hidePop関数を次のように変更します。

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

現在のワークフローでは、ViewControllerとは関係ありませんTableViewController。からではなく、UITableViewControllerからを提示しているようです。したがって、デリゲートコールバックメソッドは、クラスではなくクラス内に実装する必要がありました。それでもからを却下したい場合は、2つのオプションがあります。UIPopoverIphoneViewControllerdismissPopoverUIPopoverIphoneViewControllerUIPopoverIphoneViewController

  1. 使用法NSNotificationCenterTableViewControllerで、ポップオーバーを却下する準備ができたときに通知を投稿できます。次に、で、ViewControllerその通知を監視し、ポップオーバーを却下できます。このシナリオでは、代理人は関与しません。

  2. UIPopoverIphoneクラスとクラスからのデリゲートコールバックを設定しますViewController。したがって、ポップオーバーのボタンをタップすると、へのコールバックが作成されViewController、ポップオーバーを閉じて準備しTableViewController、提示します。ここであなたTableViewControllerとはViewControllerつながりがあります。

于 2012-08-10T16:27:49.500 に答える
0

ポップオーバーは、デフォルトで、タップが範囲外で検出されたときに自分自身を却下します。

于 2012-08-10T15:06:48.743 に答える