SKSTableView滚动问题

时间:2014-04-08 17:43:22

标签: ios objective-c uitableview scroll

我目前正在使用名为SKSTableView的自定义/可扩展tableview代码,可在Here

找到

问题在于,当我用超过10行填充表格时,UI锁定并且滚动开始非常滞后。我似乎无法追查这个问题,但我认为它与重用细胞有关。

这里有一些希望有用的代码。

-SKSTableView没有改变

-Below是app的实际文件/主屏幕中的实现

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

    Bar *bar = [bars objectAtIndex:indexPath.row];
    NSArray *friendsAtBar = (NSArray*)bar.friends;



    static NSString *cellIdentifier = @"SKSTableViewCell";
    SKSTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (!cell){//If no cell, create a new one
        cell = [[SKSTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        UIColor *cellBackgroundColor = [UIColor colorWithWhite:( 30/255.0) alpha:1.0];
        UIColor *cellTextColor = [UIColor colorWithWhite:0.80 alpha:1.0];

        UIImageView *bottomLine = [[UIImageView alloc] initWithFrame:CGRectMake(0, 73, 320, 2)];
        bottomLine.backgroundColor = [UIColor colorWithWhite:( 50/255.0) alpha:1.0];

        cell.nameLabel.textColor = cellTextColor;
        cell.friendsLabel.textColor = cellTextColor;
        cell.backgroundColor = cellBackgroundColor;
        cell.selectionBanner.backgroundColor = cellBackgroundColor;
        [cell addSubview:bottomLine];
        [cell.goingButton addTarget:self
                             action:@selector(goingButtonPressed:)
                   forControlEvents:UIControlEventTouchUpInside];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.nameLabel.frame = nameStartFrame;


    }
    if (friendsAtBar != nil && friendsAtBar.count != 0)
        cell.isExpandable = YES;
    else
        cell.isExpandable = NO;

    cell.nameLabel.text = bar.name;
    //cell.userInteractionEnabled = YES;

    if (friendsAtBar.count == 1) // If only 1 friend is going, say friend, if more than 1 friend is going say friends
        cell.friendsLabel.text = [NSString stringWithFormat:@"%lu friend going",(unsigned long)friendsAtBar.count];
    else if (friendsAtBar.count > 1)
        cell.friendsLabel.text = [NSString stringWithFormat:@"%lu friends going",(unsigned long)friendsAtBar.count];
    else {

        cell.friendsLabel.text = @"";
        //cell.nameLabel.frame = CGRectMake(20, 26, 200, 23);
    }

    //cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.tag = indexPath.row;



    [self deselectGoingButton:cell.goingButton];
    if ([bar.objectID isEqualToString:[currentUser objectForKey:@"currentBarID"]] && [self under15Hours:[currentUser objectForKey:@"barTimeStamp"]])
    {
        goingToBarID = bar.objectID; // HERE
        //NSLog(@"goingToBarID from cell: %@",goingToBarID);
        selectedGoingToButton = cell.goingButton;
        [self selectGoingButton:cell.goingButton];
    }

    cell.goingButton.tag = indexPath.row;

    cell.selectionBanner.tag = indexPath.row;


    return cell;
}




#pragma mark - TableView - Subrow

- (NSInteger)tableView:(SKSTableView *)tableView numberOfSubRowsAtIndexPath:(NSIndexPath *)indexPath {

    if (bars != nil && bars.count != 0) {

        Bar *bar = [bars objectAtIndex:indexPath.row];
        return bar.friends.count;
    }
    else
        return 0;
} // PARSE IMPACTED
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForSubRowAtIndexPath:(NSIndexPath *)indexPath {

    //NSMutableDictionary *bar = [bars objectAtIndex:indexPath.row];
    Bar *bar = [bars objectAtIndex:indexPath.row];
    NSArray *friendsAtBar = (NSArray*)bar.friends;

    //UIColor *cellBackgroundColor = [UIColor colorWithWhite:( 20/255.0) alpha:1.0];
    //UIColor *cellTextColor = [UIColor colorWithWhite:0.85 alpha:1.0];

    UIImageView *bottomLine = [[UIImageView alloc] initWithFrame:CGRectMake(0, 73, 320, 2)];
    bottomLine.backgroundColor = [UIColor colorWithWhite:( 50/255.0) alpha:1.0];

    static NSString *cellIdentifier = @"FriendsGoingCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    UIView *cellView;
    UILabel *nameLabel;
    UILabel *usernameLabel;
    UIButton *callButton;
    UIButton *textButton;
    if (!cell){//If no cell, make a new one
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cellView = [self createSubRowView];
        nameLabel = [cellView.subviews objectAtIndex:1];
        usernameLabel = [cellView.subviews objectAtIndex:2];
        usernameLabel.textColor = [UIColor colorWithWhite:0.7 alpha:1.0];
        callButton = [cellView.subviews objectAtIndex:3];
        textButton = [cellView.subviews objectAtIndex:4];
        [cell addSubview:cellView];
        [cell addSubview:bottomLine];

    }
    //cell.backgroundColor = cellBackgroundColor;
    cell.tag = 2;


    //PFUser *user = [friendsAtBar objectAtIndex:indexPath.subRow-1];
    Friend *user = [friendsAtBar objectAtIndex:indexPath.subRow-1];

    //UILabel *nameLabel = [cellView.subviews objectAtIndex:1];
    //nameLabel.text = [[friendsAtBar objectAtIndex:indexPath.subRow-1] objectForKey:@"username"];
    nameLabel.text = [NSString stringWithFormat:@"%@",user.compositeName];
    //nameLabel.textColor = cellTextColor;

   // UILabel *usernameLabel = [cellView.subviews objectAtIndex:2];
    usernameLabel.text = user.userName;

    //UIButton *callButton = [cellView.subviews objectAtIndex:3];
    callButton.tag = indexPath.subRow-1;

    //UIButton *textButton = [cellView.subviews objectAtIndex:4];
    textButton.tag = indexPath.subRow-1;



    return cell;
    }

[self createSubView]

- (UIView *)createSubRowView {

    UIView *cellView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, [rowHeight floatValue])];

    UIColor *fontColor = [UIColor colorWithWhite:0.85 alpha:1.0];


    UIView* bgview = [[UIView alloc] initWithFrame:cellView.frame];
    bgview.backgroundColor = [UIColor colorWithWhite:0.15 alpha:1.0];
    [cellView addSubview:bgview];


    UILabel *nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 16, 180, 23)];
    nameLabel.textColor = fontColor;
    nameLabel.font = [UIFont boldSystemFontOfSize:17];
    [cellView addSubview:nameLabel];


    UILabel *goingTimeStampLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 41, 180, 16)];
    goingTimeStampLabel.textColor = fontColor;
    goingTimeStampLabel.font = [UIFont systemFontOfSize:13];
    [cellView addSubview:goingTimeStampLabel];


    CGFloat x = 200;
    CGFloat width = 55;
    CGFloat height = [rowHeight floatValue];
    CGFloat y = ([rowHeight floatValue] - height)/2;

    UIButton *callButton = [[UIButton alloc] initWithFrame:CGRectMake(x, y, width, height)];
    UIImage *callIcon = [UIImage imageNamed:@"call.png"];
    [callButton setImage:callIcon forState:UIControlStateNormal];
    [callButton addTarget:self
                   action:@selector(clickedCallButton:)
         forControlEvents:UIControlEventTouchUpInside];
    [cellView addSubview:callButton];


    UIButton *textButton = [[UIButton alloc] initWithFrame:CGRectMake(x+width, y, width, height)];
    UIImage *textIcon = [UIImage imageNamed:@"text.png"];
    [textButton setImage:textIcon forState:UIControlStateNormal];
    [textButton addTarget:self
                   action:@selector(clickedTextButton:)
         forControlEvents:UIControlEventTouchUpInside];
    [cellView addSubview:textButton];

    return cellView;
}

SKSTableView.m

#import "SKSTableView.h"
#import "SKSTableViewCell.h"
#import "SKSTableViewCellIndicator.h"
#import <objc/runtime.h>

#pragma mark - NSArray (SKSTableView)

@interface NSMutableArray (SKSTableView)

- (void)initiateObjectsForCapacity:(NSInteger)numItems;

@end

@implementation NSMutableArray (SKSTableView)

- (void)initiateObjectsForCapacity:(NSInteger)numItems
{
    for (NSInteger index = [self count]; index < numItems; index++) {
        NSMutableArray *array = [NSMutableArray array];
        [self addObject:array];
    }
}

@end

#pragma mark - SKSTableView


@interface SKSTableView () <UITableViewDataSource, UITableViewDelegate>

@property (nonatomic, strong) NSMutableArray *expandedIndexPaths;

@property (nonatomic, strong) NSMutableDictionary *expandableCells;

@end

@implementation SKSTableView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];

    if (self) {
        _shouldExpandOnlyOneCell = NO;
    }

    return self;
}

- (void)setSKSTableViewDelegate:(id<SKSTableViewDelegate>)SKSTableViewDelegate
{
    self.dataSource = self;
    self.delegate = self;

    [self setSeparatorColor:[UIColor colorWithRed:236.0/255.0 green:236.0/255.0 blue:236.0/255.0 alpha:1.0]];

    if (SKSTableViewDelegate)
        _SKSTableViewDelegate = SKSTableViewDelegate;
}

- (void)setSeparatorColor:(UIColor *)separatorColor
{
    [super setSeparatorColor:separatorColor];
    [SKSTableViewCellIndicator setIndicatorColor:separatorColor];
}

- (NSMutableArray *)expandedIndexPaths
{
    if (!_expandedIndexPaths)
        _expandedIndexPaths = [NSMutableArray array];

    return _expandedIndexPaths;
}

- (NSMutableDictionary *)expandableCells
{
    if (!_expandableCells)
        _expandableCells = [NSMutableDictionary dictionary];

    return _expandableCells;
}

#pragma mark - UITableViewDataSource

#pragma mark - Required

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_SKSTableViewDelegate tableView:tableView numberOfRowsInSection:section] + [[[self expandedIndexPaths] objectAtIndex:section] count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (![self.expandedIndexPaths[indexPath.section] containsObject:indexPath]) {

        NSIndexPath *tempIndexPath = [self correspondingIndexPathForRowAtIndexPath:indexPath];
        SKSTableViewCell *cell = (SKSTableViewCell *)[_SKSTableViewDelegate tableView:tableView cellForRowAtIndexPath:tempIndexPath];

        if ([[self.expandableCells allKeys] containsObject:tempIndexPath])
            [cell setIsExpanded:[[self.expandableCells objectForKey:tempIndexPath] boolValue]];

        [cell setSeparatorInset:UIEdgeInsetsZero];

        if (cell.isExpandable) {

            [self.expandableCells setObject:[NSNumber numberWithBool:[cell isExpanded]]
                                     forKey:indexPath];

            UIButton *expandableButton = (UIButton *)cell.accessoryView;
            [expandableButton addTarget:tableView
                                 action:@selector(expandableButtonTouched:event:)
                       forControlEvents:UIControlEventTouchUpInside];

            if (cell.isExpanded) {

                cell.accessoryView.transform = CGAffineTransformMakeRotation(M_PI);

            } else {

                if ([cell containsIndicatorView])
                    [cell removeIndicatorView];

            }

        } else {

            [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
            [cell removeIndicatorView];
            cell.accessoryView = nil;

        }

        return cell;

    } else {

        NSIndexPath *indexPathForSubrow = [self correspondingIndexPathForSubRowAtIndexPath:indexPath];
        UITableViewCell *cell = [_SKSTableViewDelegate tableView:(SKSTableView *)tableView cellForSubRowAtIndexPath:indexPathForSubrow];
        cell.backgroundView = nil;
        cell.backgroundColor = [self separatorColor];
        cell.indentationLevel = 2;

        return cell;

    }
}

#pragma mark - Optional

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    if ([_SKSTableViewDelegate respondsToSelector:@selector(numberOfSectionsInTableView:)]) {

        NSInteger numberOfSections = [_SKSTableViewDelegate numberOfSectionsInTableView:tableView];

        if ([self.expandedIndexPaths count] != numberOfSections)
            [self.expandedIndexPaths initiateObjectsForCapacity:numberOfSections];

        return numberOfSections;

    }

    return 1;
}



- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    if ([_SKSTableViewDelegate respondsToSelector:@selector(tableView:titleForHeaderInSection:)])
        return [_SKSTableViewDelegate tableView:tableView titleForHeaderInSection:section];

    return nil;
}


#pragma mark - UITableViewDelegate

#pragma mark - Optional

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([_SKSTableViewDelegate respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)])
        [_SKSTableViewDelegate tableView:tableView didSelectRowAtIndexPath:indexPath];

    if ([_SKSTableViewDelegate respondsToSelector:@selector(tableView:didDeselectRowAtIndexPath:)])
        [_SKSTableViewDelegate tableView:tableView didDeselectRowAtIndexPath:indexPath];

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    SKSTableViewCell *cell = (SKSTableViewCell *)[tableView cellForRowAtIndexPath:indexPath];

    if ([cell isKindOfClass:[SKSTableViewCell class]] && cell.isExpandable) {

        cell.isExpanded = !cell.isExpanded;

        NSIndexPath *_indexPath = indexPath;
        if (cell.isExpanded && self.shouldExpandOnlyOneCell) {

            _indexPath = [self correspondingIndexPathForRowAtIndexPath:indexPath];
            [self collapseCurrentlyExpandedIndexPaths];
        }

        NSInteger numberOfSubRows = [self numberOfSubRowsAtIndexPath:_indexPath];

        NSMutableArray *indexPaths = [NSMutableArray array];
        NSInteger row = _indexPath.row;
        NSInteger section = _indexPath.section;

        for (NSInteger index = 1; index <= numberOfSubRows; index++) {

            NSIndexPath *expIndexPath = [NSIndexPath indexPathForRow:row+index inSection:section];
            [indexPaths addObject:expIndexPath];
        }

        if (cell.isExpanded) {

            [self setIsExpanded:YES forCellAtIndexPath:_indexPath];
            [self insertExpandedIndexPaths:indexPaths forSection:_indexPath.section];

        } else {

            [self setIsExpanded:NO forCellAtIndexPath:_indexPath];
            [self removeExpandedIndexPaths:indexPaths forSection:_indexPath.section];

        }

        [self accessoryViewAnimationForCell:cell];

    }
}

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    if ([_SKSTableViewDelegate respondsToSelector:@selector(tableView:accessoryButtonTappedForRowWithIndexPath:)])
        [_SKSTableViewDelegate tableView:tableView accessoryButtonTappedForRowWithIndexPath:indexPath];

    [self.delegate tableView:tableView didSelectRowAtIndexPath:indexPath];
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    CGFloat height = 0;
    if ([_SKSTableViewDelegate respondsToSelector:@selector(tableView:heightForHeaderInSection:)])
        height = [_SKSTableViewDelegate tableView:tableView heightForHeaderInSection:section];

    return height;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *view = [[UIView alloc] init];
    if ([_SKSTableViewDelegate respondsToSelector:@selector(tableView:viewForHeaderInSection:)])
        view = [_SKSTableViewDelegate tableView:tableView viewForHeaderInSection:section];

    return view;
}

#pragma mark - SKSTableViewUtils

- (IBAction)expandableButtonTouched:(id)sender event:(id)event
{
    NSSet *touches = [event allTouches];
    UITouch *touch = [touches anyObject];
    CGPoint currentTouchPosition = [touch locationInView:self];

    NSIndexPath *indexPath = [self indexPathForRowAtPoint:currentTouchPosition];

    if (indexPath)
        [self tableView:self accessoryButtonTappedForRowWithIndexPath:indexPath];
}

- (NSInteger)numberOfSubRowsAtIndexPath:(NSIndexPath *)indexPath
{
    return [_SKSTableViewDelegate tableView:self numberOfSubRowsAtIndexPath:[self correspondingIndexPathForRowAtIndexPath:indexPath]];
}

- (NSIndexPath *)correspondingIndexPathForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSInteger index = 0;
    NSInteger row = 0;

    while (index < indexPath.row) {

        NSIndexPath *tempIndexPath = [self correspondingIndexPathForRowAtIndexPath:[NSIndexPath indexPathForRow:index inSection:indexPath.section]];
        BOOL isExpanded = [[self.expandableCells allKeys] containsObject:tempIndexPath] ? [[self.expandableCells objectForKey:tempIndexPath] boolValue] : NO;

        if (isExpanded) {

            NSInteger numberOfExpandedRows = [_SKSTableViewDelegate tableView:self numberOfSubRowsAtIndexPath:tempIndexPath];

            index += (numberOfExpandedRows + 1);

        } else
            index++;

        row++;

    }

    return [NSIndexPath indexPathForRow:row inSection:indexPath.section];
}

- (NSIndexPath *)correspondingIndexPathForSubRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSInteger index = 0;
    NSInteger row = 0;
    NSInteger subrow = 0;

    while (1) {

        NSIndexPath *tempIndexPath = [self correspondingIndexPathForRowAtIndexPath:[NSIndexPath indexPathForRow:index inSection:indexPath.section]];
        BOOL isExpanded = [[self.expandableCells allKeys] containsObject:tempIndexPath] ? [[self.expandableCells objectForKey:tempIndexPath] boolValue] : NO;

        if (isExpanded) {

            NSInteger numberOfExpandedRows = [_SKSTableViewDelegate tableView:self numberOfSubRowsAtIndexPath:tempIndexPath];

            if ((indexPath.row - index) <= numberOfExpandedRows) {
                subrow = indexPath.row - index;
                break;
            }

            index += (numberOfExpandedRows + 1);

        } else
            index++;

        row++;
    }

    return [NSIndexPath indexPathForSubRow:subrow inRow:row inSection:indexPath.section];
}

- (void)setIsExpanded:(BOOL)isExpanded forCellAtIndexPath:(NSIndexPath *)indexPath
{
    NSIndexPath *correspondingIndexPath = [self correspondingIndexPathForRowAtIndexPath:indexPath];
    [self.expandableCells setObject:[NSNumber numberWithBool:isExpanded] forKey:correspondingIndexPath];
}

- (void)insertExpandedIndexPaths:(NSArray *)indexPaths forSection:(NSInteger)section
{
    NSIndexPath *firstIndexPathToExpand = indexPaths[0];
    NSIndexPath *firstIndexPathExpanded = nil;

    if ([self.expandedIndexPaths[section] count] > 0) firstIndexPathExpanded = self.expandedIndexPaths[section][0];

    __block NSMutableArray *array = [NSMutableArray array];

    if (firstIndexPathExpanded && firstIndexPathToExpand.section == firstIndexPathExpanded.section && firstIndexPathToExpand.row < firstIndexPathExpanded.row) {

        [self.expandedIndexPaths[section] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            NSIndexPath *updated = [NSIndexPath indexPathForRow:([obj row] + [indexPaths count])
                                                      inSection:[obj section]];

            [array addObject:updated];
        }];

        [array addObjectsFromArray:indexPaths];

        self.expandedIndexPaths[section] = array;

    } else {

        [self.expandedIndexPaths[section] addObjectsFromArray:indexPaths];

    }

    [self sortExpandedIndexPathsForSection:section];

    // Reload TableView
    [self insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop];

}


- (void)removeExpandedIndexPaths:(NSArray *)indexPaths forSection:(NSInteger)section
{
    NSUInteger index = [self.expandedIndexPaths[section] indexOfObject:indexPaths[0]];

    [self.expandedIndexPaths[section] removeObjectsInArray:indexPaths];

    if (index == 0) {

        __block NSMutableArray *array = [NSMutableArray array];
        [self.expandedIndexPaths[section] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            NSIndexPath *updated = [NSIndexPath indexPathForRow:([obj row] - [indexPaths count])
                                                      inSection:[obj section]];

            [array addObject:updated];
        }];

        self.expandedIndexPaths[section] = array;

    }

    [self sortExpandedIndexPathsForSection:section];

    // Reload Tableview
    [self deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop];

}

- (void)collapseCurrentlyExpandedIndexPaths
{
    NSArray *expandedCells = [self.expandableCells allKeysForObject:[NSNumber numberWithBool:YES]];

    if (expandedCells.count > 0) {
        NSIndexPath *indexPath = [expandedCells firstObject];
        [self.expandableCells setObject:[NSNumber numberWithBool:NO] forKey:indexPath];
        [self removeExpandedIndexPaths:[self.expandedIndexPaths[indexPath.section] copy] forSection:indexPath.section];

        SKSTableViewCell *cell = (SKSTableViewCell *)[self cellForRowAtIndexPath:indexPath];
        cell.isExpanded = NO;
        [self accessoryViewAnimationForCell:cell];
    }
}

- (void)sortExpandedIndexPathsForSection:(NSInteger)section
{
    [self.expandedIndexPaths[section] sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        if ([obj1 section] < [obj2 section])
            return (NSComparisonResult)NSOrderedAscending;
        else if ([obj1 section] > [obj2 section])
            return (NSComparisonResult)NSOrderedDescending;
        else {

            if ([obj1 row] < [obj2 row])
                return (NSComparisonResult)NSOrderedAscending;
            else
                return (NSComparisonResult)NSOrderedDescending;

        }
    }];
}

- (void)accessoryViewAnimationForCell:(SKSTableViewCell *)cell
{
    __block SKSTableViewCell *_cell = cell;

    [UIView animateWithDuration:0.2 animations:^{
        if (_cell.isExpanded) {

            _cell.accessoryView.transform = CGAffineTransformMakeRotation(M_PI);

        } else {
            _cell.accessoryView.transform = CGAffineTransformMakeRotation(0);
        }
    } completion:^(BOOL finished) {

        if (!_cell.isExpanded)
            [_cell removeIndicatorView];

    }];
}

@end

#pragma mark - NSIndexPath (SKSTableView)

static void *SubRowObjectKey;

@implementation NSIndexPath (SKSTableView)

@dynamic subRow;

- (NSInteger)subRow
{
    id subRowObj = objc_getAssociatedObject(self, SubRowObjectKey);
    return [subRowObj integerValue];
}

- (void)setSubRow:(NSInteger)subRow
{
    id subRowObj = [NSNumber numberWithInteger:subRow];
    objc_setAssociatedObject(self, SubRowObjectKey, subRowObj, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

+ (NSIndexPath *)indexPathForSubRow:(NSInteger)subrow inRow:(NSInteger)row inSection:(NSInteger)section
{
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
    indexPath.subRow = subrow;

    return indexPath;
}

@end

0 个答案:

没有答案