0

我正在使用 tableView 来显示每个带有不同数据的 tam tableView。当我回到所有 tableView 代表的界面时,我正在*list用基于前一个视图的数据(带有字段的不同数组)来吸引

if(select = names )...
  list = myData.Names;
if (select = workers)...
  list = myData.Workers;

等等...

在我使用的代表表中:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [list count];
}

但是当我初始化表格单元格的对象时,我怎样才能为单元格设置正确的对象。现在硬编码我使用:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
          cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"] autorelease];       
    }
    //HARD-CODED
    names *s = [list objectAtIndex:indexPath.row];
    cell.textLabel.text = names.firstName;
    cell.detailTextLabel.text=s.lastName;
    return cell;   
}

当我将其设置为时listworkers我怎么知道每次都将其投射到正确的对象上?不用写几百万if

例如,如果

  if (select = workers)...
          list = myData.Workers;

[列表计数] 将返回正确的数字,但我想根据列表显示数据,我该如何转换它以便它自动声明工人

workers *s = [list objectAtIndex:indexPath.row];
4

3 回答 3

2

我想我理解你的问题,所以让我试着解释一下:

这可以使用协议轻松解决,并将单元配置责任交给实际对象。

首先,声明你的类将遵循的协议:

@class MyTableViewCell;

@protocol CellConfiguring

- (void)configureCell:(MyTableViewCell *)cell;

@end

现在创建一些类并确保它们都符合这个协议:

@interface Workers : NSObject <CellConfiguring>

@property (retain, nonatomic) NSString *company;
@property (retain, nonatomic) NSString *salary;

@end

和:

@interface Names : NSObject <CellConfiguring>

@property (retain, nonatomic) NSString *firstName;
@property (retain, nonatomic) NSString *lastName;

@end

ETC...

在他们的实现中,他们每个人都会以不同的方式处理单元格的配置:

#import "MyTableViewCell.h"

@implementation Workers

- (void)configureCell:(MyTableViewCell *)cell
{
    cell.textLabel.text = self.company;
    cell.detailTextLabel.text = self.salary;
}

@end

和:

#import "MyTableViewCell.h"

@implementation Names

- (void)configureCell:(MyTableViewCell *)cell
{
    cell.textLabel.text = self.firstName;
    cell.detailTextLabel.text = self.lastName;
}

@end

请记住,您收到的单元格是您创建的自定义单元格。例如:

@interface MyTableViewCell : UITableViewCell

@property (retain, nonatomic) UILabel *textLabel;
@property (retain, nonatomic) UILabel *detailTextLabel;

@end

现在,在您的委托电话中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
          cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"] autorelease];       
    }

    id myObject = [list objectAtIndex:indexPath.row];
    if ([myObject conformsToProtocol:@protocol(CellConfiguring)]
        [myObject configureCell:cell];    
    return cell;   
}

就是这样。没有更多的 if-else 语句,也没有更多的强制转换。

提示:每当你开始在你的类中看到太多的 if-else 语句,弄脏你的代码,开始考虑责任。对象是否应该负责弄清楚如何配置单元?或者我们可以将该任务委托给另一个对象吗?

于 2012-09-01T13:24:38.463 回答
1

在 .h 文件中设置一个标志,如 BOOL 标志。数据将根据标志填充。

ViewDidLoad 中的标志最初将为 TRUE。

现在设置这样的列表:

if()...
listNames = myData.Names;
if ()...
listWorkers = myData.Workers;

并在代表表中:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 if(flag){
 return [listNames count];
 else
 {
  return [listWorkers count];
 }
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
          cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"] autorelease];       
    }
    if(flag)
    {
       names *s = [listNames objectAtIndex:indexPath.row];
       cell.textLabel.text = names.firstName;
       cell.detailTextLabel.text=s.lastName;
       return cell;  
    }
    else
   {
       names *s = [listWorkers objectAtIndex:indexPath.row];
       cell.textLabel.text = names.firstName; // change for listWorkers
       cell.detailTextLabel.text=s.lastName; // change for listWorkers
       return cell;
   } 
}

现在当你想改变的时候

flag = FALSE; //worker data will be filled
[tableView reloadData]
于 2012-09-01T13:09:17.420 回答
0

您也许可以使用以下解决方案...

为每种类型的对象创建一个符合 UITableViewDataSource 的自定义对象。例如 WorkerDataSource、NamesDataSource 等...

根据要显示的数据,为tableView设置正确的dataSource。我从事的一个项目的一个例子......

#define SECTION_HEADER_HEIGHT 20.0f


@interface FSMatchProgrammeDataSource ()

@property (nonatomic, copy) NSArray *matches;
@property (nonatomic, copy) NSArray *groupedMatches;

@end


@implementation FSMatchProgrammeDataSource

@synthesize matches               = _matches;
@synthesize groupedMatches        = _groupedMatches;
@synthesize didSelectMatchHandler = _didSelectMatchHandler;

+ (FSMatchProgrammeDataSource *)dataSourceWithMatches:(NSArray *)matches
{
    FSMatchProgrammeDataSource *dataSource = [[FSMatchProgrammeDataSource alloc] init];
    if (dataSource)
    {
        dataSource.matches = matches;
    }
    return dataSource;
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return _groupedMatches.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSArray *matches = [_groupedMatches objectAtIndex:section];
    return matches.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"MatchProgrammeCellIdentifier";

    FSMatchProgrammeCell *cell = (FSMatchProgrammeCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell)
    {
        cell = [[FSMatchProgrammeCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];        
    }

    NSArray *matches = [_groupedMatches objectAtIndex:indexPath.section];
    cell.match = [matches objectAtIndex:indexPath.row];

    DLog(@"%@", cell.match);

    return cell;
}

#pragma mark - Table view delegate

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
   // custom view created here ...
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return SECTION_HEADER_HEIGHT;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 44.0f;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (_didSelectMatchHandler)
    {
        NSArray *matches = [_groupedMatches objectAtIndex:indexPath.section];
        FSMatch *match   = [matches objectAtIndex:indexPath.row];

        _didSelectMatchHandler(match);
    }
}

#pragma mark - Properties

- (void)setMatches:(NSArray *)matches
{
    // matches property set, also an sorted / grouped copy is created for display called groupMatches ...
}

@end

并且 dataSource 在 tableViewController 中分配,如下所示:

- (void)refreshView
{
    BOOL showInfoLabel = NO;

    switch (_tabBar.selectedSegmentTag)
    {
        case TabProgramme:
            _tableView.dataSource = _programmeDataSource;
            _tableView.delegate   = _programmeDataSource;
            break;
        case TabResults: 
            _tableView.dataSource = _resultsDataSource;
            _tableView.delegate   = _resultsDataSource;
            break;
        case TabStandings:
            _tableView.dataSource = _standingsDataSource;
            _tableView.delegate   = _standingsDataSource;
            break;
        default: break;
    }

    [self.tableView reloadData];
}
于 2012-09-01T13:58:23.267 回答