未调用UITableView委托方法

时间:2011-08-08 20:53:32

标签: ios cocoa-touch uitableview

我在UIViewController子类中创建了一个UITableViewController并设置了委托方法,但是没有调用数据源委托方法(通过观察日志)。我是否需要继承teh UITableViewController?我错过了什么?

在MyViewController.h中

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
UITableViewController *myTableViewController;
}
@property (nonatomic, assign) UITableViewController *myTableViewController;

在MyViewController.m

- (void)viewDidLoad
{
    myTableViewController = [[UITableViewController alloc]initWithStyle:UITableViewStylePlain];
    myTableViewController.tableView.delegate = self;

}

- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section {
    NSLog(@"numberOfRowsInSection");
    return [self.assets count]; //assets is NSMutableArray
}

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSLog(@"cellForRowAtIndexPath");
    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
                             SimpleTableIdentifier];
    if (!cell) {
        cell = [[[UITableViewCell alloc]
                 initWithStyle:UITableViewCellStyleDefault
                 reuseIdentifier:SimpleTableIdentifier] autorelease];
    }
    NSUInteger row = [indexPath row];
    cell.textLabel.text = [assets objectAtIndex:row];  //assets is NSMutableArray
    cell.textLabel.font = [UIFont boldSystemFontOfSize:50];
    return cell;
}

我从另一个类调用了表视图:

UIPopoverController *popoverController = [[UIPopoverController alloc] initWithContentViewController:myTableViewController];

2 个答案:

答案 0 :(得分:5)

UITableViewController本身就是一个视图控制器。所以你通常不会在视图控制器的viewDidLoad中创建一个。您通常要么创建UITableView或子类UITableViewController,要让它担心创建和设置相关视图。

即使您正在创建视图控制器,然后劫持其视图以作为委托连接到您,您也无法显示该视图。由于视图永远不会显示,因此它永远不需要与其代理进行通信。您可能打算在viewDidLoad内添加相关视图。

最后,您实施的两种方法属于UITableViewDataSource,而非UITableViewDelegate。数据源提供表格内容,代表获得有关点击和其他相关事件的信息。所以你可能想把自己设置为数据源,而不是委托。

答案 1 :(得分:0)

原始代码中缺少两件事: 1.在MyViewController.h中创建一个表视图变量。 2.将IB中的表视图对象拖到主窗口(而不是任何视图),并将委托,数据源和视图设置为文件的所有者。 (注意表视图对象的视图需要连接到您在步骤1中创建的表视图变量。) 3.将此行添加到viewDidLoad方法:myTableViewController.tableView = tView; // tView是您在第1步中创建的表视图。

或者你也可以继承UITableViewController。