1

循环播放时

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {}

方法即时将数据设置到我的自定义单元格(图像和文本)。我想知道实现这一目标的最佳方法是什么。

我可以使用 2 个不同的数组(图像数组和文本数组)并执行以下操作:

cell.image setImage: //get image from imageArray with indexPath.row
cell.text.text = [textArray objectAtIndex:indexPath.row];

或使用这样的多维数组:

cell.image setImage: [imageArray objectAtIndex:indexPath.row] objectAtIndex:0;
cell.text.text = [textArray objectAtIndex:indexPath.row] objectAtIndex:1;

// or use of dictionary with keys

哪种方法更快或更易读?

4

3 回答 3

2

我个人认为以下是最干净的解决方案:

  • 为数组中的项目创建模型。
  • 创建一个 UITableViewCell 子类以在单元格中显示模型。子类将具有接受模型并在模型更改时重绘自身的属性。

假设我们有一个新闻应用程序。该数组充满了我们为其创建模型 NewsItem 的项目。模型标题可能如下所示:

新闻项目.h

@interface FSNewsItem : NSObject <NSCoding>

@property (nonatomic, copy, readonly)   NSString *title;
@property (nonatomic, copy, readonly)   NSURL    *URL;
@property (nonatomic, copy, readonly)   NSString *time;
@property (nonatomic, copy, readonly)   NSString *points;
@property (nonatomic, copy, readonly)   NSString *author;

// initialiser
+ (FSNewsItem *)newsItemWithTitleNode:(HTMLNode *)node 
                          subTextNode:(HTMLNode *)subNode;

@end

现在对于单元格,我们创建一个 NewsItemCell。NewsItemCell 的代码可能如下所示:

NewsItemCell.h

@interface FSNewsItemCell : UITableViewCell

@property (nonatomic, strong) FSNewsItem *newsItem;

@end

NewsItemCell.m

@interface FSNewsCell ()

@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UILabel *detailLabel;

@end


@implementation FSNewsItemCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self)
    {
        self.titleLabel                       = [[UILabel alloc] init];
        [self addSubview:_titleLabel];

        self.detailLabel                      = [[UILabel alloc] init];
        [self addSubview:_detailLabel];
    }
    return self;
}

- (void)layoutSubviews
{
    [super layoutSubviews];

    const CGRect bounds = self.bounds;
    CGFloat width = bounds.size.width - (FS_FLOAT_PADDING * 2) - 15.0f;
    _titleLabel.frame = CGRectMake(FS_FLOAT_PADDING, FS_FLOAT_CELL_PADDING_VERTICAL, width, 20.0f);

    CGFloat y = _titleLabel.frame.size.height + (FS_FLOAT_CELL_PADDING_VERTICAL * 2);
    _detailLabel.frame = CGRectMake(FS_FLOAT_PADDING, y, width, 15.0f);
}

#pragma mark - Private

- (void)setNewsItem:(FSNewsItem *)newsItem
{
    if (_newsItem == newsItem)
    {
        return;
    }

    _newsItem = newsItem;

    self.titleLabel.text = newsItem.title;

    if (_newsItem.points && _newsItem.time)
    {
        self.detailLabel.text = [NSString stringWithFormat:@"%@ | %@", _newsItem.points, newsItem.time];
    }
    else
    {
        self.detailLabel.text = newsItem.time;
    }

    [self setNeedsLayout];
}

最后,当我们想在单元格中显示新闻项目时,我们的代码如下所示:

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

    FSNewsItemCell *cell = (FSNewsItemCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[FSNewsItemCell alloc] initWithStyle:UITableViewCellStylePlain reuseIdentifier:CellIdentifier];
    }

    cell.newsItem = [_items objectAtIndex:indexPath.row];

    return cell;
}

在我看来,这是最干净的解决方案,也是我大部分时间采用的方法。我喜欢保持我的视图控制器很小。我也喜欢我的视图控制器不必知道我的(自定义)表格视图单元格具有哪些控件这一事实。根据提供的数据,表格视图单元完全负责如何绘制自身。

于 2013-02-07T11:30:20.773 回答
1

一个想法是创建一个自定义类:

@interface CellInfo : NSObject
@property (....) UIImage *image;
@property (....) NSString *text;
@end

然后:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
...
    CellInfo *info = [self.cellInfoArray objectAtIndex:indexPath.row];
    cell.image = info.image;
    cell.text = info.text;
...
}
于 2013-02-07T11:15:09.263 回答
1

我会添加一个简单的数据类并将类实例放在NSArray. 或者使用 a NSArrayofNSDictionary对象,以便可以按名称而不是位置来寻址项目。

示例类代码(这些天课程非常简单):

@interface DisplayItems : NSObject
@property (nonatomic, strong) NSString *text;
@property (nonatomic, strong) UIImage *image;
@end

@implementation DisplayItems
@end
于 2013-02-07T11:11:34.400 回答