You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

149 lines
4.8 KiB

2 years ago
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
#import "GoogleMapsDemos/MasterViewController.h"
#import <GoogleMaps/GoogleMaps.h>
#import "GoogleMapsDemos/DemoAppDelegate.h"
#import "GoogleMapsDemos/Samples/Samples.h"
@implementation MasterViewController {
NSArray *_demos;
NSArray *_demoSections;
BOOL _isPhone;
UIPopoverController *_popover;
UIBarButtonItem *_samplesButton;
__weak UIViewController *_controller;
CLLocationManager *_locationManager;
}
- (void)viewDidLoad {
[super viewDidLoad];
_isPhone = [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone;
if (!_isPhone) {
self.clearsSelectionOnViewWillAppear = NO;
} else {
UIBarButtonItem *backButton =
[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Back", @"Back")
style:UIBarButtonItemStylePlain
target:nil
action:nil];
[self.navigationItem setBackBarButtonItem:backButton];
}
self.title = NSLocalizedString(@"Maps SDK Demos", @"Maps SDK Demos");
self.title = [NSString stringWithFormat:@"%@: %@", self.title, [GMSServices SDKVersion]];
self.tableView.autoresizingMask =
UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
self.tableView.delegate = self;
self.tableView.dataSource = self;
_demoSections = [Samples loadSections];
_demos = [Samples loadDemos];
if (!_isPhone) {
[self loadDemo:0 atIndex:0];
}
}
#pragma mark - UITableViewController
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return _demoSections.count;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 35.0;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [_demoSections objectAtIndex:section];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSArray *demosInSection = [_demos objectAtIndex:section];
return [demosInSection count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:cellIdentifier];
if (_isPhone) {
[cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
}
}
NSDictionary *demo = [[_demos objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
cell.textLabel.text = [demo objectForKey:@"title"];
cell.detailTextLabel.text = [demo objectForKey:@"description"];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// The user has chosen a sample; load it and clear the selection!
[self loadDemo:indexPath.section atIndex:indexPath.row];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
#pragma mark - Split view
- (void)splitViewController:(UISplitViewController *)splitController
willHideViewController:(UIViewController *)viewController
withBarButtonItem:(UIBarButtonItem *)barButtonItem
forPopoverController:(UIPopoverController *)popoverController {
_popover = popoverController;
_samplesButton = barButtonItem;
_samplesButton.title = NSLocalizedString(@"Samples", @"Samples");
_samplesButton.style = UIBarButtonItemStyleDone;
[self updateSamplesButton];
}
- (void)splitViewController:(UISplitViewController *)splitController
willShowViewController:(UIViewController *)viewController
invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {
_popover = nil;
_samplesButton = nil;
[self updateSamplesButton];
}
#pragma mark - Private methods
- (void)loadDemo:(NSUInteger)section atIndex:(NSUInteger)index {
NSDictionary *demo = [[_demos objectAtIndex:section] objectAtIndex:index];
UIViewController *controller = [[[demo objectForKey:@"controller"] alloc] init];
_controller = controller;
if (controller != nil) {
controller.title = [demo objectForKey:@"title"];
if (_isPhone) {
[self.navigationController pushViewController:controller animated:YES];
} else {
[self.appDelegate setSample:controller];
[_popover dismissPopoverAnimated:YES];
}
[self updateSamplesButton];
}
}
// This method is invoked when the left 'back' button in the split view
// controller on iPad should be updated (either made visible or hidden).
// It assumes that the left bar button item may be safely modified to contain
// the samples button.
- (void)updateSamplesButton {
_controller.navigationItem.leftBarButtonItem = _samplesButton;
}
@end