我对以下内容感到困惑:我想使用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替换标题视图然后一切都像预期的那样工作(即父类中的表视图正确实现)。我可能只是错过了一些明显的东西,但我现在还是想不通。如果有人能够发现错误或者可以给出一些建议,我会非常感激。
答案 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 在我对原始问题的回答中使用此语法。