UIPopoverController显示空框架

时间:2012-08-19 08:14:32

标签: ios uitableview uipopovercontroller

所以我尝试使用下面显示的代码在UITableView内显示UIPopoverController

vc = [[ActionsViewController alloc] init];
initWithContentViewController:vc];
actionsController = [[UIPopoverController alloc] initWithContentViewController:vc];
actionsController.delegate = self;
NSLog(@"Try to sho it ");
[actionsController presentPopoverFromBarButtonItem:(UIBarButtonItem*)sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

这是ActionsViewController.m,它是UITableViewController

的子类
- (void)viewDidLoad 
{
    [super viewDidLoad];
    NSMutableArray* list = [[NSMutableArray alloc] initWithCapacity:4];
    self.actionList = list;
    self.clearsSelectionOnViewWillAppear = NO;
    self.contentSizeForViewInPopover = CGSizeMake(320.0, 400.0);
    [self.actionList addObject:@"Print as book"];
    [self.actionList addObject:@"Print page"];
    [self.actionList addObject:@"Save Page"];
    [self.actionList addObject:@"Share"];
}
- (int)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSLog(@"in number of section");
    return 1;
}

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    NSString* lab = [self.actionList objectAtIndex:indexPath.row];
    NSLog(@"here in there");
    cell.textLabel.text = lab;
    return cell;
}

- (NSInteger)numberOfRowsInSection:(NSInteger)section
{
    return [self.actionList count];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (self.delegate != nil) {
        [self.delegate actionSelected:indexPath.row];
    }
}

相应的.h文件

#import <UIKit/UIKit.h>

@protocol KLActionsViewControllerDelegate
- (void)actionSelected:(NSInteger)index;
@end

@interface KLActionsViewController : UITableViewController <UITableViewDataSource,UITableViewDelegate>
@property (nonatomic, retain) NSMutableArray* actionList;
@property (nonatomic, assign) id<KLActionsViewControllerDelegate> delegate;


@end

另外,我不认为函数cellForRowAtIndexPathnumberOfSectionsInTableView被调用,因为我没有看到任何控制台输出。

编辑:这是我在popover中看到的

enter image description here

4 个答案:

答案 0 :(得分:0)

我猜,问题出在那一行:

vc = [[ActionsViewController alloc] init];

如果您有NIB文件,则应使用它加载UIViewController

vc = [[ActionsViewController alloc] initWithNibName:@"ActionViewController" bundle:nil];
// the NibName must be the exact name of XIB file without extension.

或/和

您应该设置popoverContentSize

[actionController setPopoverContentSize:vc.view.frame.size];

我希望对你有所帮助。


<强>更新

它似乎不是UIPopoverController问题,只是一个简单的UITableViewController委托问题。

在那一行:

actionsController.delegate = self;

您应该将该类设置为实现UITableViewDelegate的委托。基本上它是UITableViewController本身就像

actionsController.delegate = actionController;

因此,如果您尚未在新委托类所在的self中实现委托回调方法,则应该替换此情况。你可以简单地从真正被委派回答回调的类中窃取机会,并且在新的委托类中你不回答回调。

这就是为什么你看到没有数据的空表的原因。

答案 1 :(得分:0)

viewDidLoad我添加了self.tableView = [[UITableView alloc] init]

答案 2 :(得分:0)

您需要通过(viewdidload的最后一行:

)加载表格视图
 [self.tableView reloadData];
  • 将触发表视图方法的操作。在各种tableview方法中放置一个断点,特别是 - (NSInteger的)numberOfRowsInSection:(NSInteger的)部分    {    return [self.actionList count];     } 如果没有调用,则不会加载您的tableview。

答案 3 :(得分:0)

UITableViewController是隐式set datasource和delegate,不需要显式设置datasource和delegate。

从.h文件中删除UITableViewDataSource,UITableViewDelegate

 #import <UIKit/UIKit.h>

@protocol KLActionsViewControllerDelegate
 - (void)actionSelected:(NSInteger)index;
@end

  @interface KLActionsViewController : UITableViewController 
 @property (nonatomic, retain) NSMutableArray* actionList;
 @property (nonatomic, assign) id<KLActionsViewControllerDelegate> delegate;


 @end

并删除此行 ** actionsController.delegate = self;

  vc = [[ActionsViewController alloc] init];
 actionsController = [[UIPopoverController alloc] initWithContentViewController:vc];
  [actionsController presentPopoverFromBarButtonItem:(UIBarButtonItem*)sender  permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];