0

例如,我有一个设置菜单,它通向其他菜单,并且都具有相同的样式。表格视图单元格自定义是这样完成的:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = (UITableViewCell *)[self dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                      reuseIdentifier:CellIdentifier];

        cell.contentView.backgroundColor = [UIColor clearColor];
        cell.textLabel.backgroundColor = [UIColor clearColor];
    }

    BOOL isFirstRowInSection = NO;

    if (indexPath.row == 0) isFirstRowInSection = YES;

    BOOL isLastRowInSection = NO;

    int numberOfRowsInSection = [tableView.dataSource tableView:self numberOfRowsInSection:indexPath.section];

    if (indexPath.section == 0 && indexPath.row == numberOfRowsInSection - 1) {
        isLastRowInSection = YES;
    }

    UIImageView *imageView = [[UIImageView alloc] initWithFrame:cell.bounds];
    imageView.image = cellBackgroundImage(cell.bounds.size, isFirstRowInSection, isLastRowInSection);

    cell.backgroundView = imageView;

    //cell.textLabel.text = @"This is a cell";

    return cell;
}

我希望这个类被主设置菜单和所有子菜单使用,但是虽然我希望他们提供自己的数据,比如每个单元格的文本是什么,但我希望它从这里获取单元格样式方法。

我怎样才能做到这一点?目前的想法是将部分数据源协议复制到我自己的委托中,以便他们可以响应。

4

2 回答 2

1

您可以创建 UITableViewCell 的特定子类并在单元格本身中实现您的视觉特征。

如果您在 InterfaceBuilder 中创建一个子类和一个 nib 文件,您可以拥有一个类似于

+ (NSString *)cellIdentifier {
    return NSStringFromClass([self class]);
}


+ (id)cellForTableView:(UITableView *)tableView {
    NSString *cellID = [self cellIdentifier];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    if (cell == nil) {
        NSArray *nibObjects = [[self nib] instantiateWithOwner:nil options:nil];
        NSAssert2(([nibObjects count] > 0) && 
                  [[nibObjects objectAtIndex:0] isKindOfClass:[self class]],
                  @"Nib '%@' does not appear to contain a valid %@", 
                  [self nibName], NSStringFromClass([self class]));
        cell = [nibObjects objectAtIndex:0];
    }
    return cell;    
}

因此,如果您已经定义了一个类(例如 MyTableViewCell)并在 IB 中构建接口,则确保将 FileOwner 设为 MyTableViewCell 的一个对象,并拥有各种子类特定视觉对象的 IBOutlets,而 Bob 是您的叔叔。

然后在你的 tableViewController 的 cellForRowAtIndexPath 方法中,你使用类似的东西

MyTableViewCell *cell = [MyTableViewCell cellForTableView:tableView];

通过这种方式,大部分可视化表示逻辑都保存在 Interface Builder 代码中。如果您正在制作一个通用应用程序,则必须创建两个 nib 文件,但这并不太难。

于 2012-07-14T19:21:37.677 回答
0

实现这一点的一种方法是让你的“其他菜单”——这个 tableview“进入”的菜单——调用这个 tableview 的- tableView:cellForRowAtIndexPath:方法。看起来像这样:

ChildTableViewController.m:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // Somehow, you'll need to give this child VC a pointer to the
    // "root" tableview – I'll pretend that pointer is "rootTableView"
    return [rootTableView tableView:tableView cellForRowAtIndexPath:indexPath];
}

您必须确保您对从该方法返回的内容很了解,因为现在不仅有一个 tableview,而且许多都在使用该方法来获取他们的单元格。您可以通过检查UITableView要求单元格的内容来做到这一点:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = (UITableViewCell *)[self dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                      reuseIdentifier:CellIdentifier];

        cell.contentView.backgroundColor = [UIColor clearColor];
        cell.textLabel.backgroundColor = [UIColor clearColor];
    }

    BOOL isFirstRowInSection = NO;

    if (indexPath.row == 0) isFirstRowInSection = YES;

    BOOL isLastRowInSection = NO;

    int numberOfRowsInSection = [tableView.dataSource tableView:self numberOfRowsInSection:indexPath.section];

    if (indexPath.section == 0 && indexPath.row == numberOfRowsInSection - 1) {
        isLastRowInSection = YES;
    }

    UIImageView *imageView = [[UIImageView alloc] initWithFrame:cell.bounds];
    imageView.image = cellBackgroundImage(cell.bounds.size, isFirstRowInSection, isLastRowInSection);

    cell.backgroundView = imageView;

    //cell.textLabel.text = @"This is a cell";

    // Now, all your cells have the same formatting; do your custom 
    // data grabbing or whatever you need to do for the different
    // tableviews
    if (tableview == [self view]) {
        return cell;
    } else if (tableview = [self childTableView1]) {
        // Do the setup you'd want for your first child tableview
        return cell;
    } else if (tableview = [self childTableView2]) {
        // Do the setup you'd want for your second child tableview
        return cell;
    }   // More if statements as needed

    return cell;
}

不过,简单地将代码从您显示的- tableView:cellForRowAtIndexPath:方法复制并粘贴到每个“子”表视图的方法中可能会更简洁。它不会太长,而且设置起来也不会那么令人头疼。

于 2012-07-14T17:55:02.310 回答