UITableView作为另一个UITableView的tableHeaderView

时间:2011-03-24 17:37:23

标签: iphone delegates uitableview

我对以下内容感到困惑:我想使用UITableView的单个单元格作为另一个UITableView的标题视图。第二个表视图又是一个从不同的UITableView类继承的对象,因为它完全共享它的功能。事实上唯一的区别是第二个UITableView有一个标题视图(应该是单个单元格的UITableView)。

带标题的UITableView界面如下所示:

#import <UIKit/UIKit.h>
#import "ScheduleDetailsController.h"

@interface TodayDetailsViewController : ScheduleDetailsController <UITableViewDelegate, UITableViewDataSource> {
   UITableView *headerView;
}

@property (nonatomic, retain) UITableView *headerView;  

@end

实施如下:

#import "TodayDetailsViewController.h"

@implementation TodayDetailsViewController

@synthesize headerView;

- (void)loadView {
   [super loadView];

   self.headerView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
   self.headerView.backgroundColor = [UIColor clearColor];
   self.headerView.opaque = NO;
   self.headerView.delegate = self;
   self.headerView.dataSource = self;

   // This is a UITableView defined as a property in the parent class 
   self.scheduleDetailsTable.tableHeaderView = self.headerView;
}

...

#pragma mark - 
#pragma mark Table View Data Source Methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
   if (tableView == self.scheduleDetailsTable.tableHeaderView)
      return 1;
   else
      return [self.scheduleDetailsTable numberOfSections];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
   if (tableView == self.scheduleDetailsTable.tableHeaderView)
      return 1;
   else
      return [self.scheduleDetailsTable numberOfRowsInSection:section];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   if (tableView == self.scheduleDetailsTable.tableHeaderView) {

   ...

      return cell;
   } else
      return [self.scheduleDetailsTable cellForRowAtIndexPath:indexPath];
}

@end

编译运行时没有错误,但是我也没有看到任何错误,即视图保持空白。我也试过用UIView替换标题视图然后一切都像预期的那样工作(即父类中的表视图正确实现)。我可能只是错过了一些明显的东西,但我现在还是想不通。如果有人能够发现错误或者可以给出一些建议,我会非常感激。

2 个答案:

答案 0 :(得分:0)

不是没有,但你真的需要创建一个完整的 UITableViewController和 UITableView只是为了使用UITableViewCell作为标题吗?毕竟,UITableViewCell是UIView的子类。

这或多或少都有效(必须让标签本身不透明;我想UITableView通常会处理它):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    UITableViewController *testTableViewController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];

    UITableViewCell *tableViewCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:NULL];

    tableViewCell.textLabel.text = @"Test";
    tableViewCell.textLabel.opaque = NO;
    tableViewCell.detailTextLabel.text = @"123";
    tableViewCell.detailTextLabel.opaque = NO;

    testTableViewController.tableView.tableHeaderView = tableViewCell;

    [tableViewCell release];

    // self.window is initilized and hooked up in MainMenu.xib
    self.window.rootViewController = testTableViewController;
    [self.window makeKeyAndVisible];

    [testTableViewController release];

    return YES;
}

就此而言,如果上述内容不能满足您的需求,为什么不要只在一个部分中将所有内容放在表格视图中,并使用最上面的部分作为“标题”:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return ([super numberOfSectionsInTableView:tableView] + 1);
}



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (section == 0) {
        return 1;
    } else {
        return [super tableView:tableView numberOfRowsInSection:(section + 1)];
    }
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0) {
        // ***** Build and return your header cell *****
    } else {
        NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:(indexPath.section + 1)];
        return [super tableView:tableView cellForRowAtIndexPath:newIndexPath];
    }
}

根据需要对所有其他数据源代理重复。

只是一个想法...

答案 1 :(得分:0)

好吧,我通过从

替换原始帖子中的委托方法的return语句解决了这个问题
return [self.scheduleDetailsTable cellForRowAtIndexPath:indexPath]; 

return [super tableView:tableView cellForRowAtIndexPath:indexPath];

类似于其他委托方法。现在一切都像预期的那样。感谢 peterjb 在我对原始问题的回答中使用此语法。