-
-
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 |
Really appreciate it if you can have a swift version of this.
+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
I agree with herveg, we would really appreciate the template written in Swift. Now its more pain than gain ...