iOS将动态子视图添加到uitableviewcell中

时间:2016-04-28 09:47:36

标签: ios uitableview

我正在创建这样的UITableViewCell。在那个屏幕上,我可能有1个测验,2个测验等,1个民意调查,2个民意调查,等等。这将是动态的。

因此,当用户根据我cell上收到的数据向上和向下滚动时,我会不断删除之前的UIViews并重新创建。 (我知道这是非常糟糕的。现在我的滚动问题了。)

enter image description here

    NSArray *quizzez = self.cellData[SERVER_QUIZZES];
    NSArray *polls = self.cellData[SERVER_POLLS];
    NSMutableArray *combinedQuizPoll = [NSMutableArray array];
    [combinedQuizPoll addObjectsFromArray:quizzez];
    [combinedQuizPoll addObjectsFromArray:polls];

    for (UIView *vw in self.quizPollViewCollection) {
        [vw removeFromSuperview];
    }

    for (NSDictionary *quizPollDict in combinedQuizPoll)
    {            
        QuizPollSubView *vwQuizPoll = [QuizPollSubView loadFromNibWithType:QuizPollSubViewNoViewRelated andNavType:self.navType];
        [vwQuizPoll setW:CGRectGetWidth(self.frame)];
        [vwQuizPoll setDelegate:self];
        [vwQuizPoll setData:muQuizPollDict];
        [vwQuizPoll setX:0 andY:offset];
        [self.contentView addSubview:vwQuizPoll];
        offset = CGRectGetMaxY(vwQuizPoll.frame) + 4;
        [self.quizPollViewCollection addObject:vwQuizPoll];
    }

如何提高性能?我也在StackOverflow中研究了其他类似的问题。

How to make a UITableViewCell with different subviews reusable?

1)我需要动态测验,民意调查视图(测验数量,每个单元格的民意调查会有所不同)

2)我如何参考我创建的那些视图?

1 个答案:

答案 0 :(得分:0)

首先,我必须说你使用同一个细胞将物品放在垂直方向的方法并不是最好的方法。对于这种情况,您应该使用多个单元格。类似的东西:

  • ...
  • DecriptionCell
  • QuizCell
  • QuizCell
  • PollCell
  • PollCell
  • PollCell
  • ...

无论如何,我会建议你一个可以帮助你而不改变UITableView结构的解决方案。

实际上几周前我遇到了同样的问题,我找到了一个非常好的解决方案。

基本上,主要的概念是,为了重用UITableViewCell,你不应该在配置单元格时添加或删除视图,因为性能会受到影响。

所以,我使用的解决方案是,为单元可以拥有的每种配置使用不同的重用标识符。

唯一的要求是没有单元格的Nib文件。

如果我理解正确,你的细胞可以进行动态测验和民意测验。我们来说最多10个测验和最多10个调查。虽然我看着它们都有相同的View,QuizPollSubView。所以我们每个单元最多放置20个子视图。

所以在你注册单元格的方法中我会做下一步:

Class myClass = [CustomTableViewCell class];
NSString *classID = NSStringFromClass(myClass);
for (NSUInteger index = 0; index < 20; index++) {
    NSString *identifier = [classID stringByAppendingString:[@(index) stringValue]];
    [self.tableView registerClass:myClass forCellReuseIdentifier:identifier];
}

然后在CellForRow中,您必须使用适当的标识符将单元格出列,例如:

NSString *cellID = NSStringFromClass([CustomTableViewCell class]);
NSUInteger numberOfQuizsAndPolls = 3 + 2; //This is 3 quizs and 2 polls, I gess that you can read from the DataModel
NSString *identifier = [cellID stringByAppendingString:[@(numberOfQuizsAndPolls) stringValue]];
CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];

//then configure the cell

接下来,在initWithStyle:reuseIdentifier:你应该用空值创建子视图,从标识符中提取信息

NSString *stringNumber = [reuseIdentifier stringByReplacingOccurrencesOfString:NSStringFromClass([self class])
                                                                         withString:@""];
NSUInteger numberOfSubviews = [stringNumber integerValue];

//here you should add all of your QuizPollSubView with emtpy content.
for (NSUInteger index = 0; index < numberOfSubviews; index++) {
    QuizPollSubView *vwQuizPoll = [QuizPollSubView loadFromNibWithType:QuizPollSubViewNoViewRelated andNavType:self.navType];
    [vwQuizPoll setW:CGRectGetWidth(self.frame)];
    [vwQuizPoll setDelegate:self];
    //[vwQuizPoll setData:muQuizPollDict]; YOU CAN NOT SET THE DATA HERE BECAUSE YOU DONT HAVE IT
    [vwQuizPoll setX:0 andY:offset];
    [self.contentView addSubview:vwQuizPoll];
    offset = CGRectGetMaxY(vwQuizPoll.frame) + 4;
    [self.quizPollViewCollection addObject:vwQuizPoll];
}

最后,您必须在配置单元格中设置正确的信息。类似的东西:

- (void)configureWithQuizPollDict:(NSDictionary *)combinedQuizPoll
{
    for (NSDictionary *quizPollDict in combinedQuizPoll)
    {
        //get the proper index in the quizPollViewCollection.
        QuizPollSubView *vwQuizPoll = self.quizPollViewCollection[index];
        [vwQuizPoll setData:muQuizPollDict];
    }
}

我希望它能帮到你!!

由于

PD:如果你想使用带有Nib的Cell,我们可能需要将UITableView子类化以添加自定义队列