UITableView как tableHeaderView для другого UITableView - PullRequest
1 голос
/ 24 марта 2011

Я застрял на следующем: я хочу использовать одну ячейку 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 голосов
/ 25 марта 2011

Что ж, я решил проблему, заменив операторы возврата методов делегата в моей исходной публикации с

return [self.scheduleDetailsTable cellForRowAtIndexPath:indexPath]; 

на

return [super tableView:tableView cellForRowAtIndexPath:indexPath];

И аналогично для других методов делегата.Теперь все работает как положено.Спасибо peterjb за использование этого синтаксиса в ответе на мой оригинальный вопрос.

0 голосов
/ 25 марта 2011

Не зря, но вам действительно нужно создать целый 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];
    }
}

Повторите при необходимости для всех остальных делегатов источника данных.

Просто мысль ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...