UITableView里面的UICollectionView部分中的行不正确

时间:2014-09-02 18:40:30

标签: ios objective-c uitableview uicollectionview

我在群组(分段)模式下有UITableView。该表的每个部分包含大约5个单元格。 表格的每个单元格由一个UILabel和一个UICollectionView组成。 UICollectionView将包含一组带水平滚动的简单项目。

所以,我有类似Grid View的东西,它在Storyboard中看起来像: enter image description here

在模拟器中,它看起来像是: enter image description here

我无法理解的问题:

当我水平滚动任何行时 - 另一行(可能在同一个或另一个部分中)可以与第一行同步滚动,看起来它们彼此有某种联系或它是同样的UICollectionView

如何在每个UICollectionView中使用不同的UITableViewCell或打破"奇怪的连接"?

我的代码(标题):

@interface ipAthleteHistoryTableViewController : UIViewController <UICollectionViewDataSource, UITableViewDataSource, UITableViewDelegate>

@property (weak, nonatomic) IBOutlet UITextField *datesRangeFromPeer;
@property (weak, nonatomic) IBOutlet UITextField *datesRangeToPeer;

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

- (IBAction)datesRangeFromPeerEditingExited:(id)sender;
- (IBAction)datesRangeFromPeerSet:(id)sender;

- (IBAction)datesRangeToPeerEditingExited:(id)sender;
- (IBAction)datesRangeToPeerSet:(id)sender;

- (IBAction)todaySpeedButtonPressed:(id)sender;
- (IBAction)weekSpeedButtonPressed:(id)sender;
- (IBAction)monthSpeedButtonPressed:(id)sender;
- (IBAction)quarterSpeedButtonPressed:(id)sender;

@end

实施

- (void)viewDidLoad
{
    _dumbNumberOfItems = 24;
    _dumbNumberOfItems2 = 5;

    [super viewDidLoad];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _dumbNumberOfItems2;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return _dumbNumberOfItems;
}

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

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return [NSString stringWithFormat:@"12.09.2014:%ld", (long)section];
}

- (UITableView *)findParentTableView:(UITableViewCell *)tableCellView
{
    return (UITableView *)[ipNavigationHelper findParentViewOfClass:[UITableView class]
                                                    ofChildView:tableCellView];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{       
    ipAthleteHistoryTableCell *cell = [tableView dequeueReusableCellWithIdentifier:athleteHistoryChart_ExcerciseTrialsCell forIndexPath:indexPath];

    [[cell excerciseTitle] setText:[NSString stringWithFormat:@"Title %li:%li; %ld", [indexPath section], (long)[indexPath row], (long)[cell excerciseTrials]]];
    [[cell excerciseTrials] reloadData];

    return cell;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    ipAthleteHistoryExcerciseTrialCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:athleteHistoryChart_TrialCell
                                                                                     forIndexPath:indexPath];
    ipAthleteHistoryTableCell *upCell = [self findParentTableCell:collectionView];

    [[cell actualTrial] setText:[ipNumeralsConverter convertToLatinArabNumber:[indexPath row]]];
    [[cell actualRepeats] setText:[NSString stringWithFormat:@"%li", [[[self findParentTableView:upCell] indexPathForCell:upCell] section]]];
    [[cell targetRepeats] setText:[NSString stringWithFormat:@"%li", [[[self findParentTableView:upCell] indexPathForCell:upCell] row]]];
    [[cell workWeight] setText:[NSString stringWithFormat:@"%li", [indexPath row]*10]];

    return cell;
}

所有初始工作(如ID注册,单元格原型设计等)都是使用Storyboard完成的。

2 个答案:

答案 0 :(得分:0)

您的问题可能与UITableViewCells重用的事实有关。因此,当您滚动并查看新单元格时,它实际上只是其中一个单元格消失了。要处理您的问题,您需要确保在cellForRowAtIndexPath中正确初始化单元格,并确保覆盖之前的任何数据。

答案 1 :(得分:-1)

好的,最后我决定通过创建独特的Cell ID并在其中创建它来逃离重复使用功能的单元格#34;飞行中&#34;没有Storyboard原型。它看起来很好。

代码是标准的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellId = [NSString stringWithFormat:@"%@-%ld-%ld",
                                             athleteHistoryTable_ExcerciseTrialsCell,
                                             (long)[indexPath section],
                                             (long)[indexPath row]];
    ipAthleteHistoryTableCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
    if (cell == nil)
    {
        cell = [[ipAthleteHistoryTableCell alloc] initWithStyle:UITableViewCellStyleDefault
                                            reuseIdentifier:cellId];

        [[cell excerciseTrials] registerClass:[ipAthleteHistoryExcerciseTrialCell class]
               forCellWithReuseIdentifier:athleteHistoryTable_TrialCell];

        [[cell excerciseTrials] setDataSource:self];
    }

    [[cell excerciseTitle] setText:[NSString stringWithFormat:@"Excercise Title %li:%li; %ld",
                                                         [indexPath section],
                                                         (long)[indexPath row],
                                                         (long)[cell excerciseTrials]]];

    [[cell excerciseTrials] reloadData];

    return cell;
}