-
-
Save jamesyu/ba03c1a550f14f88f95d to your computer and use it in GitHub Desktop.
// | |
// This is the template PFQueryTableViewController subclass file. Use it to customize your own subclass. | |
// | |
#import <UIKit/UIKit.h> | |
#import "Parse/Parse.h" | |
@interface MyPFQueryTableViewController : PFQueryTableViewController | |
@end | |
@implementation MyPFQueryTableViewController | |
- (id)initWithStyle:(UITableViewStyle)style { | |
self = [super initWithStyle:style]; | |
if (self) { | |
// Custom the table | |
// The className to query on | |
self.className = @"Foo"; | |
// The key of the PFObject to display in the label of the default cell style | |
self.textKey = @"text"; | |
// Uncomment the following line to specify the key of a PFFile on the PFObject to display in the imageView of the default cell style | |
// self.imageKey = @"image"; | |
// Whether the built-in pull-to-refresh is enabled | |
self.pullToRefreshEnabled = YES; | |
// Whether the built-in pagination is enabled | |
self.paginationEnabled = YES; | |
// The number of objects to show per page | |
self.objectsPerPage = 25; | |
} | |
return self; | |
} | |
- (void)didReceiveMemoryWarning { | |
// Releases the view if it doesn't have a superview. | |
[super didReceiveMemoryWarning]; | |
// Release any cached data, images, etc that aren't in use. | |
} | |
#pragma mark - UIViewController | |
- (void)viewDidLoad { | |
[super viewDidLoad]; | |
// Uncomment the following line to preserve selection between presentations. | |
// self.clearsSelectionOnViewWillAppear = NO; | |
// Uncomment the following line to display an Edit button in the navigation bar for this view controller. | |
// self.navigationItem.rightBarButtonItem = self.editButtonItem; | |
} | |
- (void)viewDidUnload { | |
[super viewDidUnload]; | |
// Release any retained subviews of the main view. | |
// e.g. self.myOutlet = nil; | |
} | |
- (void)viewWillAppear:(BOOL)animated { | |
[super viewWillAppear:animated]; | |
} | |
- (void)viewDidAppear:(BOOL)animated { | |
[super viewDidAppear:animated]; | |
} | |
- (void)viewWillDisappear:(BOOL)animated { | |
[super viewWillDisappear:animated]; | |
} | |
- (void)viewDidDisappear:(BOOL)animated { | |
[super viewDidDisappear:animated]; | |
} | |
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { | |
// Return YES for supported orientations | |
return (interfaceOrientation == UIInterfaceOrientationPortrait); | |
} | |
#pragma mark - PFQueryTableViewController | |
- (void)objectsWillLoad { | |
[super objectsWillLoad]; | |
// This method is called before a PFQuery is fired to get more objects | |
} | |
- (void)objectsDidLoad:(NSError *)error { | |
[super objectsDidLoad:error]; | |
// This method is called every time objects are loaded from Parse via the PFQuery | |
} | |
/* | |
// Override to customize what kind of query to perform on the class. The default is to query for | |
// all objects ordered by createdAt descending. | |
- (PFQuery *)queryForTable { | |
PFQuery *query = [PFQuery queryWithClassName:self.className]; | |
// If Pull To Refresh is enabled, query against the network by default. | |
if (self.pullToRefreshEnabled) { | |
query.cachePolicy = kPFCachePolicyNetworkOnly; | |
} | |
// If no objects are loaded in memory, we look to the cache first to fill the table | |
// and then subsequently do a query against the network. | |
if (self.objects.count == 0) { | |
query.cachePolicy = kPFCachePolicyCacheThenNetwork; | |
} | |
[query orderByDescending:@"createdAt"]; | |
return query; | |
} | |
*/ | |
/* | |
// Override to customize the look of a cell representing an object. The default is to display | |
// a UITableViewCellStyleDefault style cell with the label being the textKey in the object, | |
// and the imageView being the imageKey in the object. | |
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object { | |
static NSString *CellIdentifier = @"Cell"; | |
PFTableViewCell *cell = (PFTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; | |
if (cell == nil) { | |
cell = [[PFTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; | |
} | |
// Configure the cell | |
cell.textLabel.text = [object objectForKey:self.textKey]; | |
cell.imageView.file = [object objectForKey:self.imageKey]; | |
return cell; | |
} | |
*/ | |
/* | |
// Override if you need to change the ordering of objects in the table. | |
- (PFObject *)objectAtIndex:(NSIndexPath *)indexPath { | |
return [self.objects objectAtIndex:indexPath.row]; | |
} | |
*/ | |
/* | |
// Override to customize the look of the cell that allows the user to load the next page of objects. | |
// The default implementation is a UITableViewCellStyleDefault cell with simple labels. | |
- (UITableViewCell *)tableView:(UITableView *)tableView cellForNextPageAtIndexPath:(NSIndexPath *)indexPath { | |
static NSString *CellIdentifier = @"NextPage"; | |
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; | |
if (cell == nil) { | |
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; | |
} | |
cell.selectionStyle = UITableViewCellSelectionStyleNone; | |
cell.textLabel.text = @"Load more..."; | |
return cell; | |
} | |
*/ | |
#pragma mark - UITableViewDataSource | |
/* | |
// Override to support conditional editing of the table view. | |
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { | |
// Return NO if you do not want the specified item to be editable. | |
return YES; | |
} | |
*/ | |
/* | |
// Override to support editing the table view. | |
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { | |
if (editingStyle == UITableViewCellEditingStyleDelete) { | |
// Delete the object from Parse and reload the table view | |
} else if (editingStyle == UITableViewCellEditingStyleInsert) { | |
// Create a new instance of the appropriate class, and save it to Parse | |
} | |
} | |
*/ | |
/* | |
// Override to support rearranging the table view. | |
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { | |
} | |
*/ | |
/* | |
// Override to support conditional rearranging of the table view. | |
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { | |
// Return NO if you do not want the item to be re-orderable. | |
return YES; | |
} | |
*/ | |
#pragma mark - UITableViewDelegate | |
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { | |
[super tableView:tableView didSelectRowAtIndexPath:indexPath]; | |
} | |
@end |
+1 for a modern Swift implementation.
What's the best way to reload the TableView and re-run the query programmatically(not using an interface control or gesture)? I think [self.tableView reloadData]; reloads the table view with the original query data not the refreshed data. Please help, Thanks!
EDIT: [self loadObjects];
Seems to do the task. Thanks!
Swift++
Here's one that supports Storyboards, customizing the default cells, changes the row height and adds a sort to the generated query written in Swift. Doesn't include everything as listed above but should get some of you guys started.
import UIKit
import Parse
import ParseUI
class ShipmentListViewController: PFQueryTableViewController {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// The className to query on
self.parseClassName = "ClassName"
// The key of the PFObject to display in the label of the default cell style
self.textKey = "text"
// Uncomment the following line to specify the key of a PFFile on the PFObject to display in the imageView of the default cell style
self.imageKey = "image"
// Whether the built-in pull-to-refresh is enabled
self.pullToRefreshEnabled = true
// Whether the built-in pagination is enabled
self.paginationEnabled = true
// The number of objects to show per page
self.objectsPerPage = 25
}
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.rowHeight = 54.0
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func queryForTable() -> PFQuery {
let query = super.queryForTable()
query.orderByAscending("createdAt")
return query
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell? {
let cell = super.tableView(tableView, cellForRowAtIndexPath: indexPath, object: object)
// Configure the cell
cell?.imageView?.contentMode = .ScaleAspectFill
cell?.imageView?.clipsToBounds = true
cell?.accessoryType = .DisclosureIndicator
return cell
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
}
For the ones that want to do the same in Swift, you can check the examples provided by Parse: https://github.com/ParsePlatform/ParseUI-iOS/tree/master/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController
Really appreciate it if you can have a swift version of this.