How to use NSNotification in iOS?

来源:互联网 发布:apache ignite 性能 编辑:程序博客网 时间:2024/05/22 05:34

1. Adding an observer 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadDataWithNotification:) name:@"Test" object:nil];

2. Adding the observe method:

- (void)loadDataWithNotification: (NSNotification *) notification{        if ([notification.name isEqualToString:@"Test"]) {        NSLog(@"Notification received");        [self retrieveData];    }}

3. Posting notification on the other ViewController.

[[NSNotificationCenter defaultCenter] postNotificationName:@"Test" object:nil];


Notification will be sent back to the MainViewController when the user click on the add Button, in order to notify the MainViewController to reload its data.

MainViewController


DetailViewController



Main code:

TableViewController.h

////  TableViewController.h//  CoreDataTutorial////  Created by Jason on 28/05/12.//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.//#import <UIKit/UIKit.h>@interface TableViewController : UITableViewController@property (strong, nonatomic) NSManagedObjectContext *context;@end


TableViewController.m

////  TableViewController.m//  CoreDataTutorial////  Created by Jason on 28/05/12.//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.//#import "TableViewController.h"#import "DetailViewController.h"#import "People.h"@interface TableViewController ()@property (strong, nonatomic) NSArray *peopleArray;@end@implementation TableViewController@synthesize peopleArray=_peopleArray;@synthesize context=_context;//retrieve data - (void)retrieveData{    NSFetchRequest *request=[[NSFetchRequest alloc] init];    NSEntityDescription *entity=[NSEntityDescription entityForName:@"People" inManagedObjectContext:self.context];        NSSortDescriptor *sortDescriptor=[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];            request.entity=entity;    request.sortDescriptors=[NSArray arrayWithObject:sortDescriptor];    request.fetchBatchSize=20;    NSError *error;    self.peopleArray=[self.context executeFetchRequest:request error:&error];    [self.tableView reloadData];}- (void)loadDataWithNotification: (NSNotification *) notification{        if ([notification.name isEqualToString:@"Test"]) {        NSLog(@"Notification received");        [self retrieveData];    }}- (id)initWithStyle:(UITableViewStyle)style{    self = [super initWithStyle:style];    if (self) {        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadDataWithNotification:) name:@"Test" object:nil];    }    return self;}- (void)viewDidLoad{    [super viewDidLoad];    [self retrieveData];    // 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 =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(add)];}- (void)add{    DetailViewController *detailView=[[DetailViewController alloc] init];    [self presentModalViewController:detailView animated:YES];}- (void)viewDidUnload{    [super viewDidUnload];    // Release any retained subviews of the main view.    // e.g. self.myOutlet = nil;}- (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{    return self.peopleArray.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    static NSString *CellIdentifier = @"Cell";    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];        // Configure the cell...    if (!cell) {        cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];    }        People *people=(People *)[self.peopleArray objectAtIndex:indexPath.row];    cell.textLabel.text=people.name;    cell.detailTextLabel.text=[NSString stringWithFormat:@"%@",people.number];        return cell;}/*// 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 row from the data source        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];    }       else if (editingStyle == UITableViewCellEditingStyleInsert) {        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view    }   }*//*// 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 - Table view delegate- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{    // Navigation logic may go here. Create and push another view controller.    /*     <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];     // ...     // Pass the selected object to the new view controller.     [self.navigationController pushViewController:detailViewController animated:YES];     */}@end


DetailViewController.h

////  DetailViewController.h//  CoreDataTutorial////  Created by Jason on 28/05/12.//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.//#import <UIKit/UIKit.h>#import "AppDelegate.h"@interface DetailViewController : UIViewController{    IBOutlet UITextField *nameField;    IBOutlet UITextField *numberField;}@end


DetailViewController.m

////  DetailViewController.m//  CoreDataTutorial////  Created by Jason on 28/05/12.//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.//#import "DetailViewController.h"#import "People.h"@interface DetailViewController ()@property (nonatomic, strong) AppDelegate *app;@end@implementation DetailViewController@synthesize app=_app;- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];    if (self) {        UINavigationBar *navigationBar=[[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];        UINavigationItem *navigationItem=[[UINavigationItem alloc] initWithTitle:@"Add Detail"];        [navigationBar pushNavigationItem:navigationItem animated:YES];                        UIBarButtonItem *addButton=[[UIBarButtonItem alloc] initWithTitle:@"Add" style:UIBarButtonItemStyleBordered target:self action:@selector(add)];        UIBarButtonItem *cancelButton=[[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancel)];                navigationItem.leftBarButtonItem=cancelButton;        navigationItem.rightBarButtonItem=addButton;        //adding navigationBar        [self.view addSubview:navigationBar];    }    return self;}- (void)viewDidLoad{    [super viewDidLoad];    self.app=[[UIApplication sharedApplication] delegate];}- (void)add{    NSManagedObjectContext *context=self.app.managedObjectContext;    People *people=[NSEntityDescription insertNewObjectForEntityForName:@"People" inManagedObjectContext:context];        people.name=nameField.text;    people.number=[NSNumber numberWithInt:[numberField.text intValue]];        NSError *error;    if (![context save:&error ]) {        UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Error" message:@"Can not save people"delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];        [alert show];    }else {            UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"saved" message:@"The record has saved" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];            [alert show];    }            [[NSNotificationCenter defaultCenter] postNotificationName:@"Test" object:nil];    [self dismissModalViewControllerAnimated:YES];        }- (void)retrieveData{    //retrieving data    NSManagedObjectContext *context=self.app.managedObjectContext;    NSFetchRequest *request=[[NSFetchRequest alloc] init];    NSEntityDescription *entityDescription=[[NSEntityDescription alloc] init];    request.entity=entityDescription;    NSError *error;    NSArray *peopleArray=[context executeFetchRequest:request error:&error];        for(People *people in peopleArray){        NSLog(@"name=%@,number=%@",people.name, people.number);    }    }- (void)cancel{    [self dismissModalViewControllerAnimated:YES];}- (void)viewDidUnload{    [super viewDidUnload];    // Release any retained subviews of the main view.    // e.g. self.myOutlet = nil;}- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{    return (interfaceOrientation == UIInterfaceOrientationPortrait);}@end





原创粉丝点击