基于某些条件在CustomTableViewCell中初始化CustomViews

时间:2017-10-18 08:05:48

标签: ios objective-c

我在UITableViewUIViewController中有一个CustomTableViewCellCustomTableViewCell包含两件事,

  1. 将由其他自定义设计的UIViews填充的UIView(如下所述),
  2. 固定UIView有一些标签
  3. 表的数据源是具有类似属性的某些模型 modelType = image, music, video等。对于每种模型类型,我设计了一个UIView,该CustomTableViewCell将在modelType的基础上加载到UIViewController的视图中。

    我的问题是“如何将数据类型从CustomTableViewCell传递到modelType,然后如何在#import "ContentsTableViewCell.h" @interface ContentsTableViewCell () @property NSString* feedType; @end @implementation ContentsTableViewCell -(instancetype)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if(self) { // before initializing this xib I must have feedType. . . NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"ContentsTableViewCell" owner:self options:nil]; UIView* mainView = (UIView*)[nibViews objectAtIndex:0]; [self addSubview:mainView]; } return self; } @end”的基础上初始化每个UIView。

    这就是我所拥有的

    public String removeDuplicates(char[] arr) {
            StringBuilder sb = new StringBuilder();
    
            if (arr == null)
                return null;
            int len = arr.length;
    
            if (arr.length < 2)
                return sb.append(arr[0]).toString();
    
            for (int i = 0; i < len; i++) {
    
                for (int j = i + 1; j < len; j++) {
                    if (arr[i] == arr[j]) {
                        arr[j] = 0;
    
                    }
                }
                if (arr[i] != 0)
                    sb.append(arr[i]);
            }
    
            return sb.toString().trim();
        }
    

    上面的代码是初始化与此.m文件关联的xib。但是如何在这里传递feedType来初始化其他视图。

1 个答案:

答案 0 :(得分:0)

您将无法在UITableViewCell的初始化中传递任何参数,因为UITableView会在需要时将其出列或初始化。

[注意]:除非阅读解决方案2,否则不要开始实施。

解决方案1:您可以根据需要以cellForRowAtIndexPath:方式配置此单元格。为Feed类型定义枚举并传递它。

typedef NS_ENUM(NSInteger, FeedType)
{
    FeedTypeText,
    FeedTypeImage,
    FeedTypeAudio,
    FeedTypeVideo,
};

创建单元格配置方法

@interface ContentsTableViewCell : UITableViewCell
@property (nonatomic, assign) FeedType feedType;

- (void)configureCellWithFeedType:(FeedType)feedType;

@end

@implementation ContentsTableViewCell

- (void)configureCellWithFeedType:(FeedType)feedType
{
    switch (feedType) {
        case FeedTypeText:
            // initializing  xib . .
            break;
        case FeedTypeImage:
            // initializing  xib . .
            break;
        case FeedTypeAudio:
            // initializing  xib . .
            break;
        case FeedTypeVideo:
            // initializing  xib . .
            break;
    }
}

@end

然后从cellForRowAtIndexPath:方法调用此配置方法。

[cell configureCellWithFeedType:feedType];

解决方案2 上述解决方案会显着降低浏览效果。因此,最好的方法是创建四个具有相关xib视图的独立类。

@interface TextTableViewCell : UITableViewCell

@end

@interface ImageTableViewCell : UITableViewCell

@end

@interface AudioTableViewCell : UITableViewCell

@end

@interface VideoTableViewCell : UITableViewCell

@end

最后根据需要加载适当的细胞。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ContentsTableViewCell *cell = nil;

    FeedType feedType = FeedTypeAudio;

    switch (feedType) {
        case FeedTypeText:
            cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(TextTableViewCell class)];
            break;
        case FeedTypeImage:
            cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(ImageTableViewCell class)];
            break;
        case FeedTypeAudio:
            cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(AudioTableViewCell class)];
            break;
        case FeedTypeVideo:
            cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(VideoTableViewCell class)];
            break;
    }
  return cell;
}

希望它能解决你的问题。

相关问题