创建

时间:2016-11-02 09:40:32

标签: ios objective-c uitableview custom-cell nsindexpath

我必须创建一个UITableView,其中包含2个自定义单元格 RestTime ExerciseTime 。在 ExerciseTime 之后是 RestTime 单元格。 这是我的tableView的设计:

Design TableView

这是我的工具代码:

- 高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // RestTime
        if (indexPath.row % 2 == 1) {
            return 40.0f;
        }

        // ExerciseTime
        else {
            return 65.0f;
        }
    }

- 细胞数量

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return (self.preset.blocks.count * 2) - 1;
    }

-Cell for row

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

                    if(indexPath.row % 2 == 1) {
                    RestTimeTableViewCell *restTimeCell = (RestTimeTableViewCell *)[tableView dequeueReusableCellWithIdentifier:RestTimeTableViewCellIdentifier  forIndexPath:indexPath];
                    RestTime *restTime = (RestTime *)[self.restTimeArray objectAtIndex:indexPath.row];
                    //CustomCell
                    return restTimeCell;
                }else{
                    ExerciseTimeTableViewCell *exerciseTimecell = (ExerciseTimeTableViewCell *)[tableView dequeueReusableCellWithIdentifier:ExerciseTimeTableViewCellIdentifier  forIndexPath:indexPath];

                    //Cell index
                    int index = (int)(indexPath.row / 2);
                    //exerciseTimes is a NSSet
                    ExerciseTime *exerciseTime = [self.preset.exerciseTimes.allObjects objectAtIndex:index];

                    //CustomCell
                    return exerciseTimecell;
                }
                return nil;
 }

输出是这样的:

Output TableView

我试图将我的NSSet转换为NSMutableArray,它现在仍在使用。

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

                        if(indexPath.row % 2 == 1) {
                        RestTimeTableViewCell *restTimeCell = (RestTimeTableViewCell *)[tableView dequeueReusableCellWithIdentifier:RestTimeTableViewCellIdentifier  forIndexPath:indexPath];
                        RestTime *restTime = (RestTime *)[self.restTimeArray objectAtIndex:indexPath.row];
                        //CustomCell
                        return restTimeCell;
                    }else{
                        ExerciseTimeTableViewCell *exerciseTimecell = (ExerciseTimeTableViewCell *)[tableView dequeueReusableCellWithIdentifier:ExerciseTimeTableViewCellIdentifier  forIndexPath:indexPath];


                        NSMutableArray *array = [[self.preset.exerciseTimes allObjects] mutableCopy];
                        int index = (int)(indexPath.row / 2);
                        ExerciseTime *exerciseTime = [array objectAtIndex:index];

                        //CustomCell
                        return exerciseTimecell;
                    }
                    return nil;
     }

您可以看到所有 ExerciseCell 的顺序不正确。我无法弄清楚为什么它在创建单元格后不在正确的索引中。我希望订单按其创建的时间排序,而不是字母abcdef ...或123456 ....任何人都可以帮助我找出问题所在以及如何解决它。

3 个答案:

答案 0 :(得分:1)

我发现了问题,并且NSSet在开头没有排序,我用@“createdTime”对它进行了排序,我的问题解决了。

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"createdTime" ascending:YES];
NSArray *sortedArray = [self.exerciseTimes sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];

Exercise *exerciseTime = (Exercise *)[sortedArray objectAtIndex:indexPath.row/2];

答案 1 :(得分:0)

请找到我的工作代码和截图

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UITableView *messageTableView;

@property (retain, nonatomic) NSMutableArray *datasourceArray;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.

    [self.messageTableView registerNib:[UINib nibWithNibName:@"RestTimeTableViewCell" bundle:nil] forCellReuseIdentifier:@"RestTime"];
    [self.messageTableView registerNib:[UINib nibWithNibName:@"ExerciseTimeTableViewCell" bundle:nil] forCellReuseIdentifier:@"ExerciseTime"];

    self.messageTableView.separatorColor = [UIColor blackColor];
    self.messageTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;

    self.datasourceArray = [[NSMutableArray alloc]init];
    for (int i = 1; i <= 20; i++) {
        [self.datasourceArray addObject:[NSString stringWithFormat:@"%d%d%d%d",i,i,i,i]];
    }


}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
}


-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.datasourceArray.count * 2;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
        // RestTime
    if (indexPath.row % 2 == 1) {
        return 40.0f;
    }
        // ExerciseTime
    else {
        return 65.0f;
    }
}

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

    if (indexPath.row % 2 == 1) {
        RestTimeTableViewCell *restTimeCell = (RestTimeTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"RestTime"  forIndexPath:indexPath];
            //Access you object from array like this

        return restTimeCell;
    }
    else {
        ExerciseTimeTableViewCell *exerciseTimecell = (ExerciseTimeTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"ExerciseTime"  forIndexPath:indexPath];
            //Access you object from array like this
        int index = (int)(indexPath.row / 2);

        exerciseTimecell.exerciseName.text = [self.datasourceArray objectAtIndex:index];
        return exerciseTimecell;
    }
}
@end

<强> 截图

enter image description here

答案 2 :(得分:0)

NSSet只是一个集合,对象之间没有顺序。如果您想保留订单,可以使用NSArray(或NSMutableArray)代替NSSet