Cagatay Gurturk
Cagatay Gurturk

Reputation: 7246

Three20 TTTableViewController load more automatically

I've a TTTableViewController which follows TTTableViewController -> TTDataSource -> TTModel pattern. I've TTTableMoreButton and my list goes on to load more items when the user clicks on it.

How can I change the behaviour of this TTTableMoreButton? When the user came to the end of the list, I want it to behave as if it is clicked. In Facebook app, there is an implementation like this. I hope I could tell what I want.

Upvotes: 0

Views: 937

Answers (2)

Cagatay Gurturk
Cagatay Gurturk

Reputation: 7246

Here I've my own approach which i found out just before coneybeare's answer. I simply subclassed TTTableMoreButton and TTTableMoreButtonCell classes and in the "- (void)layoutSubviews" method, I detect that "Load More" button is appearing, and it should start loading more data if it is not already doing it.

I'm not sure which approach (coneybeaare's or mine) is the best and I'm looking forward for the comments about it.

AutoMoreTableItem.h

@interface AutoMoreTableItem : TTTableMoreButton {

}

@end

AutoMoreTableItem.m

#import "AutoMoreTableItem.h"

@implementation AutoMoreTableItem

@end

AutoMoreTableItemCell.h

@interface AutoMoreTableItemCell : TTTableMoreButtonCell {

}

@end

AutoMoreTableItemCell.m

#import "AutoMoreTableItemCell.h"
#import "AutoMoreTableItem.h"


@implementation AutoMoreTableItemCell
- (void)setObject:(id)object {
    if (_item != object) {
        [super setObject:object];

        AutoMoreTableItem* item = object;
        self.animating = item.isLoading;

        self.textLabel.textColor = TTSTYLEVAR(moreLinkTextColor);
        self.selectionStyle = TTSTYLEVAR(tableSelectionStyle);
        self.accessoryType = UITableViewCellAccessoryNone;
    }
}


- (void)layoutSubviews {
    [super layoutSubviews];

    AutoMoreTableItem* moreLink = self.object;
    if(moreLink.isLoading ==YES) {
        return;
    }

    if (moreLink.model) {
        moreLink.isLoading = YES;
        self.animating = YES;
        [moreLink.model load:TTURLRequestCachePolicyDefault more:YES];

    }

}

@end

And of course, in the datasource implementation:

- (Class)tableView:(UITableView*)tableView cellClassForObject:(id) object {   

    if([object isKindOfClass:[AutoMoreTableItem class]]){
        return [AutoMoreTableItemCell class];  
    }  else {  
        return [super tableView:tableView cellClassForObject:object];  
    }  
}  

Upvotes: 1

coneybeare
coneybeare

Reputation: 33101

Here is how to do it.

full disclosure: It is my code blog.

Upvotes: 3

Related Questions