524 lines
No EOL
21 KiB
Objective-C
524 lines
No EOL
21 KiB
Objective-C
//
|
|
// MenuViewController.m
|
|
// Trovebox
|
|
//
|
|
// Created by Patrick Santana on 5/10/12.
|
|
// Copyright 2013 Trovebox
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
|
|
|
|
#import "MenuViewController.h"
|
|
#import "IIViewDeckController.h"
|
|
|
|
@interface MenuViewController()
|
|
- (MenuTableViewCell *) getDefaultUITableViewCell:(UITableView *)tableView image:(NSString *) imagePath imageSelected:(NSString *) imageSelectedPath;
|
|
@end
|
|
|
|
@implementation MenuViewController
|
|
|
|
@synthesize popoverController = _popoverController2;
|
|
@synthesize location = _location;
|
|
@synthesize appSettingsViewController;
|
|
|
|
@synthesize galleryController=_galleryController;
|
|
@synthesize albumController=_albumController;
|
|
@synthesize tagController=_tagController;
|
|
@synthesize syncController=_syncController;
|
|
@synthesize profileController=_profileController;
|
|
|
|
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
|
|
{
|
|
self = [super initWithNibName:nibName bundle:nibBundle];
|
|
if (self){
|
|
// needs update menu
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
selector:@selector(eventHandler:)
|
|
name:kNotificationNeededsUpdate
|
|
object:nil ];
|
|
|
|
self.tableView.backgroundColor = UIColorFromRGB(0x6B5851);
|
|
// no separator
|
|
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
|
|
|
|
coreLocationController = [[CoreLocationController alloc] init];
|
|
coreLocationController.delegate = self;
|
|
|
|
library = [[ALAssetsLibrary alloc] init];
|
|
|
|
}
|
|
return self;
|
|
}
|
|
|
|
#pragma mark - View lifecycle
|
|
|
|
- (void)viewDidLoad
|
|
{
|
|
[super viewDidLoad];
|
|
|
|
self.tableView.scrollsToTop = NO;
|
|
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];
|
|
self.tableView.scrollEnabled = NO;
|
|
}
|
|
|
|
- (BOOL) shouldAutorotate
|
|
{
|
|
return YES;
|
|
}
|
|
|
|
- (NSUInteger) supportedInterfaceOrientations
|
|
{
|
|
return UIInterfaceOrientationMaskPortrait;
|
|
}
|
|
|
|
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
|
|
{
|
|
return (interfaceOrientation == UIInterfaceOrientationPortrait);
|
|
}
|
|
|
|
#pragma mark - Table view data source
|
|
|
|
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
|
|
{
|
|
// if type = group, returns only 7: We need to remove Tags and My Profile
|
|
NSString *type = [[NSUserDefaults standardUserDefaults] objectForKey:kTroveboxTypeUser];
|
|
if (type && [type isEqualToString:@"group"]){
|
|
return 7;
|
|
}else{
|
|
return 9;
|
|
}
|
|
}
|
|
|
|
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
|
|
{
|
|
static NSString *menuTableViewSectionCellIdentifier = @"menuTableViewSectionCell";
|
|
static NSString *menuTableViewSearchCellIdentifier = @"menuTableViewSearchCell";
|
|
|
|
BOOL groupUser = NO;
|
|
NSString *type = [[NSUserDefaults standardUserDefaults] objectForKey:kTroveboxTypeUser];
|
|
if (type && [type isEqualToString:@"group"]){
|
|
groupUser = YES;
|
|
}
|
|
|
|
NSUInteger row = [indexPath row];
|
|
if ( row == 0){
|
|
// the first one is the search
|
|
// load the search cell
|
|
MenuTableViewSearchCell *cell = [tableView dequeueReusableCellWithIdentifier:menuTableViewSearchCellIdentifier];
|
|
|
|
if (cell == nil){
|
|
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MenuTableViewSearchCell" owner:nil options:nil];
|
|
for(id currentObject in topLevelObjects)
|
|
{
|
|
if([currentObject isKindOfClass:[MenuTableViewSearchCell class]])
|
|
{
|
|
cell = (MenuTableViewSearchCell *)currentObject;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
cell.contentView.backgroundColor = UIColorFromRGB(0x40332D);
|
|
cell.labelSearch.delegate = cell;
|
|
|
|
// set temporary the user's name
|
|
NSString *name = [[NSUserDefaults standardUserDefaults] objectForKey:kTroveboxNameUser];
|
|
if (name)
|
|
cell.labelTroveboxUser.text = name;
|
|
else{
|
|
cell.labelTroveboxUser.text = @"Trovebox User";
|
|
}
|
|
|
|
return cell;
|
|
}else if ( row == 1){
|
|
// latest activity
|
|
MenuTableViewCell *cell = [self getDefaultUITableViewCell:tableView image:@"menu-latest.png" imageSelected:@"menu-latest-selected.png"];
|
|
cell.label.text = NSLocalizedString(@"Latest Activity", @"Menu - title for Home");
|
|
return cell;
|
|
}else if ( row == 2){
|
|
// photos - gallery
|
|
MenuTableViewCell *cell = [self getDefaultUITableViewCell:tableView image:@"menu-gallery.png" imageSelected:@"menu-gallery-selected.png"];
|
|
cell.label.text = NSLocalizedString(@"Gallery", @"Menu - title for Gallery");
|
|
return cell;
|
|
}else if ( row == 3){
|
|
// albums
|
|
MenuTableViewCell *cell = [self getDefaultUITableViewCell:tableView image:@"menu-album.png" imageSelected:@"menu-album-selected.png"];
|
|
cell.label.text = NSLocalizedString(@"Albums", @"Menu - title for Albums");
|
|
return cell;
|
|
}else if ( row == 4 && !groupUser){
|
|
// tags
|
|
MenuTableViewCell *cell = [self getDefaultUITableViewCell:tableView image:@"menu-tags.png" imageSelected:@"menu-tags-selected.png"];
|
|
cell.label.text = NSLocalizedString(@"Tags", @"Menu - title for Tags");
|
|
return cell;
|
|
}else if ( (row == 5 && !groupUser) || (row == 4 && groupUser) ){
|
|
// upload & sync
|
|
MenuTableViewCell *cell = [self getDefaultUITableViewCell:tableView image:@"menu-upload.png" imageSelected:@"menu-upload-selected.png"];
|
|
cell.label.text = NSLocalizedString(@"Upload & Sync", @"Menu - title for Upload & Sync");
|
|
return cell;
|
|
}else if ( (row == 6 && !groupUser) || (row == 5 && groupUser) ){
|
|
// preferences
|
|
// load preference cell
|
|
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:menuTableViewSectionCellIdentifier];
|
|
if (cell == nil) {
|
|
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MenuTableViewSectionCell" owner:nil options:nil];
|
|
cell = [topLevelObjects objectAtIndex:0];
|
|
}
|
|
|
|
cell.contentView.backgroundColor = UIColorFromRGB(0x40332D);
|
|
|
|
return cell;
|
|
}else if ( row == 7 && !groupUser){
|
|
// my account
|
|
MenuTableViewCell *cell = [self getDefaultUITableViewCell:tableView image:@"menu-profile.png" imageSelected:@"menu-profile-selected.png"];
|
|
cell.label.text = NSLocalizedString(@"My Account", @"Menu - title for Account");
|
|
return cell;
|
|
}else {
|
|
// settings
|
|
MenuTableViewCell *cell = [self getDefaultUITableViewCell:tableView image:@"menu-settings.png" imageSelected:@"menu-settings-selected.png"];
|
|
cell.label.text = NSLocalizedString(@"Settings", @"Menu - title for Settings");
|
|
return cell;
|
|
}
|
|
|
|
}
|
|
|
|
- (MenuTableViewCell *) getDefaultUITableViewCell:(UITableView *)tableView image:(NSString *) imagePath imageSelected:(NSString *) imageSelectedPath
|
|
{
|
|
static NSString *menuTableViewCellIdentifier = @"menuTableViewCell";
|
|
MenuTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:menuTableViewCellIdentifier];
|
|
|
|
if (cell == nil) {
|
|
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MenuTableViewCell" owner:nil options:nil];
|
|
cell = [topLevelObjects objectAtIndex:0];
|
|
}
|
|
|
|
cell.imageSelected = imageSelectedPath;
|
|
cell.imageDefault = imagePath;
|
|
|
|
[cell.image setImage:[UIImage imageNamed:imagePath]];
|
|
|
|
return cell;
|
|
}
|
|
|
|
#pragma mark - Table view delegate
|
|
|
|
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
|
|
{
|
|
BOOL groupUser = NO;
|
|
NSString *type = [[NSUserDefaults standardUserDefaults] objectForKey:kTroveboxTypeUser];
|
|
if (type && [type isEqualToString:@"group"]){
|
|
groupUser = YES;
|
|
}
|
|
|
|
|
|
[self.viewDeckController closeLeftViewBouncing:^(IIViewDeckController *controller) {
|
|
|
|
if ([controller.centerController isKindOfClass:[UINavigationController class]]) {
|
|
if (indexPath.row == 1){
|
|
// Latest activity
|
|
controller.centerController = SharedAppDelegate.centerController;
|
|
}else if (indexPath.row ==2){
|
|
// Gallery
|
|
if (self.galleryController == nil){
|
|
self.galleryController = [[UINavigationController alloc]initWithRootViewController:[[GalleryViewController alloc] init]];
|
|
}
|
|
controller.centerController = self.galleryController;
|
|
}else if ( indexPath.row == 3){
|
|
// Albums
|
|
if (self.albumController == nil){
|
|
self.albumController = [[UINavigationController alloc]initWithRootViewController:[[AlbumViewController alloc] init]];
|
|
}
|
|
controller.centerController = self.albumController;
|
|
}else if ( indexPath.row == 4 && !groupUser){
|
|
// Tags
|
|
if (self.tagController == nil){
|
|
self.tagController = [[UINavigationController alloc]initWithRootViewController:[[TagViewController alloc] init]];
|
|
}
|
|
controller.centerController = self.tagController;
|
|
}else if ( (indexPath.row == 5 && !groupUser) || (indexPath.row == 4 && groupUser) ){
|
|
// Upload & Sync
|
|
if (self.syncController == nil){
|
|
SyncViewController *photoPicker = [[SyncViewController alloc] initWithNibName:@"SyncViewController" bundle:nil];
|
|
ELCImagePickerController *syncController = [[ELCImagePickerController alloc] initWithRootViewController:photoPicker] ;
|
|
[photoPicker setParent:syncController];
|
|
[syncController setDelegate:photoPicker];
|
|
self.syncController = syncController;
|
|
}
|
|
controller.centerController = self.syncController;
|
|
controller.centerController.navigationController.navigationBar.tintColor = [UIColor whiteColor];
|
|
}else if ( indexPath.row == 7 && !groupUser){
|
|
// Account - Profile
|
|
if (self.profileController == nil){
|
|
if ([DisplayUtilities isIPad]){
|
|
self.profileController = [[UINavigationController alloc]initWithRootViewController:[[ProfileViewController alloc] initWithNibName:@"ProfileViewControlleriPad" bundle:nil]];
|
|
}else{
|
|
self.profileController = [[UINavigationController alloc]initWithRootViewController:[[ProfileViewController alloc] init]];
|
|
}
|
|
}
|
|
controller.centerController = self.profileController;
|
|
}else{
|
|
// Settings
|
|
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:self.appSettingsViewController];
|
|
controller.centerController = nav;
|
|
}
|
|
}
|
|
|
|
[NSThread sleepForTimeInterval:(300+arc4random()%700)/1000000.0]; // mimic delay... not really necessary
|
|
}];
|
|
}
|
|
|
|
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
|
|
|
|
// if type = group, returns only 7: We need to remove Tags and My Profile
|
|
BOOL groupUser = NO;
|
|
NSString *type = [[NSUserDefaults standardUserDefaults] objectForKey:kTroveboxTypeUser];
|
|
if (type && [type isEqualToString:@"group"]){
|
|
groupUser = YES;
|
|
}
|
|
|
|
if ( [indexPath row] == 0){
|
|
return 64;
|
|
}else if ( ([indexPath row] == 6) || (([indexPath row] == 5) && groupUser)){
|
|
return 37;
|
|
}else{
|
|
return 44;
|
|
}
|
|
}
|
|
|
|
- (void) openLoginViewController
|
|
{
|
|
// open the login
|
|
LoginViewController *controller = [[LoginViewController alloc]initWithNibName:[DisplayUtilities getCorrectNibName:@"LoginViewController"] bundle:nil ];
|
|
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
|
|
[self presentViewController:navController animated:YES completion:nil];
|
|
}
|
|
|
|
- (void) eventHandler: (NSNotification *) notification{
|
|
#ifdef DEVELOPMENT_ENABLED
|
|
NSLog(@"###### Event triggered: %@", notification);
|
|
#endif
|
|
|
|
if ([notification.name isEqualToString:kNotificationNeededsUpdate]){
|
|
[self.tableView reloadData];
|
|
}
|
|
}
|
|
|
|
- (OpenPhotoIASKAppSettingsViewController*)appSettingsViewController {
|
|
if (!appSettingsViewController) {
|
|
appSettingsViewController = [[OpenPhotoIASKAppSettingsViewController alloc] initWithNibName:@"IASKAppSettingsView" bundle:nil];
|
|
appSettingsViewController.delegate = self;
|
|
[appSettingsViewController setShowCreditsFooter:NO];
|
|
appSettingsViewController.showDoneButton = NO;
|
|
}
|
|
return appSettingsViewController;
|
|
}
|
|
|
|
- (void)settingsViewController:(IASKAppSettingsViewController*)sender buttonTappedForKey:(NSString*)key {
|
|
if ([key isEqualToString:@"CleanCache"]){
|
|
[Timeline deleteAllTimelineInManagedObjectContext:[SharedAppDelegate managedObjectContext]];
|
|
NSError *saveError = nil;
|
|
if (![[SharedAppDelegate managedObjectContext] save:&saveError]){
|
|
NSLog(@"Error to save context = %@",[saveError localizedDescription]);
|
|
}
|
|
|
|
//remove cache
|
|
SDImageCache *imageCache = [SDImageCache sharedImageCache];
|
|
[imageCache clearMemory];
|
|
[imageCache clearDisk];
|
|
[imageCache cleanDisk];
|
|
}
|
|
}
|
|
|
|
- (void)settingsViewControllerDidEnd:(IASKAppSettingsViewController*)sender {
|
|
[self dismissViewControllerAnimated:YES completion:nil];
|
|
}
|
|
|
|
- (void) openCamera:(id) sender
|
|
{
|
|
|
|
#ifdef DEVELOPMENT_ENABLED
|
|
NSLog(@"Open Camera");
|
|
#endif
|
|
|
|
// refresh profile details
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationProfileRefresh object:nil];
|
|
|
|
self.viewDeckController.centerController = SharedAppDelegate.centerController;
|
|
[self selectLatestActivity];
|
|
|
|
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
|
|
picker.delegate = self;
|
|
|
|
[coreLocationController.locMgr startUpdatingLocation];
|
|
[self presentViewController:picker animated:YES completion:nil];
|
|
}
|
|
|
|
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
|
|
{
|
|
|
|
/*
|
|
// the image itself to save in the library,
|
|
// this data must be a raw data on DLCImagePickerController. Remove the PNG representation
|
|
UIImage *pickedImage = [info objectForKey:@"image"];
|
|
|
|
// User come from Snapshot. We will temporary save in the Library.
|
|
NSData* pngData = UIImageJPEGRepresentation(pickedImage,1.0);
|
|
CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)pngData, NULL);
|
|
|
|
NSDictionary *exifTemp = (__bridge NSDictionary *) CGImageSourceCopyPropertiesAtIndex(source,0,NULL);
|
|
__block NSMutableDictionary *exif = [exifTemp mutableCopy];
|
|
|
|
NSDictionary *gpsDict = [self currentLocation];
|
|
if ([gpsDict count] > 0) {
|
|
#ifdef DEVELOPMENT_ENABLED
|
|
NSLog(@"There is location");
|
|
#endif
|
|
[exif setObject:gpsDict forKey:(NSString*) kCGImagePropertyGPSDictionary];
|
|
}else{
|
|
#ifdef DEVELOPMENT_ENABLED
|
|
NSLog(@"No location found");
|
|
#endif
|
|
}
|
|
|
|
[library writeImageToSavedPhotosAlbum:[pickedImage CGImage] metadata:exif completionBlock:^(NSURL *newUrl, NSError *error) {
|
|
if (error) {
|
|
NSLog(@"The photo took by the user could not be saved = %@", [error description]);
|
|
} else {
|
|
PhotoViewController* controller = [[PhotoViewController alloc]initWithNibName:[DisplayUtilities getCorrectNibName:@"PhotoViewController"] bundle:nil url:newUrl];
|
|
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
|
|
[navController.navigationBar troveboxStyle:NO];
|
|
[self dismissViewControllerAnimated:YES completion:^{
|
|
[self presentViewController:navController animated:YES completion:nil];
|
|
}];
|
|
}
|
|
}];
|
|
|
|
|
|
// stop location
|
|
[coreLocationController.locMgr stopUpdatingLocation];
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
|
|
{
|
|
[picker dismissViewControllerAnimated:YES completion:^{
|
|
[coreLocationController.locMgr stopUpdatingLocation];
|
|
}];
|
|
}
|
|
|
|
//Creates an EXIF field for the current geo location.
|
|
- (NSMutableDictionary*)currentLocation {
|
|
NSMutableDictionary *locDict = [[NSMutableDictionary alloc] init];
|
|
|
|
if (self.location != nil) {
|
|
CLLocationDegrees exifLatitude = self.location.coordinate.latitude;
|
|
CLLocationDegrees exifLongitude = self.location.coordinate.longitude;
|
|
|
|
[locDict setObject:self.location.timestamp forKey:(NSString*) kCGImagePropertyGPSTimeStamp];
|
|
|
|
if (exifLatitude < 0.0) {
|
|
exifLatitude = exifLatitude*(-1);
|
|
[locDict setObject:@"S" forKey:(NSString*)kCGImagePropertyGPSLatitudeRef];
|
|
} else {
|
|
[locDict setObject:@"N" forKey:(NSString*)kCGImagePropertyGPSLatitudeRef];
|
|
}
|
|
[locDict setObject:[NSNumber numberWithFloat:exifLatitude] forKey:(NSString*)kCGImagePropertyGPSLatitude];
|
|
|
|
if (exifLongitude < 0.0) {
|
|
exifLongitude=exifLongitude*(-1);
|
|
[locDict setObject:@"W" forKey:(NSString*)kCGImagePropertyGPSLongitudeRef];
|
|
} else {
|
|
[locDict setObject:@"E" forKey:(NSString*)kCGImagePropertyGPSLongitudeRef];
|
|
}
|
|
[locDict setObject:[NSNumber numberWithFloat:exifLongitude] forKey:(NSString*) kCGImagePropertyGPSLongitude];
|
|
}
|
|
|
|
return locDict;
|
|
|
|
}
|
|
|
|
- (void)locationUpdate:(CLLocation *)position{
|
|
self.location = position;
|
|
#ifdef DEVELOPMENT_ENABLED
|
|
NSLog(@"Position %@", position);
|
|
#endif
|
|
}
|
|
|
|
- (void)locationError:(NSError *)error {
|
|
NSLog(@"Location error %@", [error description]);
|
|
|
|
if ([error code] == kCLErrorDenied){
|
|
// validate if we had checked once if user allowed location
|
|
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
|
|
if (standardUserDefaults) {
|
|
|
|
if (![[NSUserDefaults standardUserDefaults] boolForKey:kValidateNotAllowedLocation] ||
|
|
[[NSUserDefaults standardUserDefaults] boolForKey:kValidateNotAllowedLocation] == NO){
|
|
// validated
|
|
[standardUserDefaults setBool:YES forKey:kValidateNotAllowedLocation];
|
|
|
|
// synchronize the keys
|
|
[standardUserDefaults synchronize];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void) selectLatestActivity
|
|
{
|
|
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone];
|
|
}
|
|
|
|
- (void) displayProfileScreen
|
|
{
|
|
[self.viewDeckController openLeftViewAnimated:YES completion:^(IIViewDeckController *controller) {
|
|
// Account - Profile
|
|
if (self.profileController == nil){
|
|
self.profileController = [[UINavigationController alloc]initWithRootViewController:[[ProfileViewController alloc] init]];
|
|
self.profileController.title= NSLocalizedString(@"My Account", @"Menu - title for Account");
|
|
}
|
|
|
|
controller.centerController = self.profileController;
|
|
// select profile
|
|
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:7 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone];
|
|
|
|
//sleep a little and close the left view
|
|
[NSThread sleepForTimeInterval:(300+arc4random()%700)/1000000.0]; // mimic delay... not really necessary
|
|
[self.viewDeckController closeLeftViewAnimated:YES];
|
|
}];
|
|
}
|
|
|
|
- (void) displayHomeScreen
|
|
{
|
|
[self.viewDeckController openLeftViewAnimated:YES completion:^(IIViewDeckController *controller) {
|
|
controller.centerController = SharedAppDelegate.centerController;
|
|
[self selectLatestActivity];
|
|
[MBProgressHUD hideAllHUDsForView:self.viewDeckController.view animated:YES];
|
|
[NSThread sleepForTimeInterval:(300+arc4random()%700)/1000000.0]; // mimic delay... not really necessary
|
|
[self.viewDeckController closeLeftViewAnimated:YES];
|
|
}];
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
|
}
|
|
|
|
@end |