Monday, July 4, 2011

NSNotificationCenter tutorial

Design Phase: In today’s post we will be seeing a simple demonstration for the notification that I have explained in my earlier post.


I will be using two UIViewController subclasses one with the label which will be the listener and the other will be the broadcaster with the slider control, and when the slider will slide then we will register one notification and then refer that notification with its name to display the data of the slider on the first view controller, here’s a view at the final output to see what we are going to do.






Step 1: Open Xcode create a windows based application add two files of UIViewController subclass one with the name ListenerViewController and other with the name BroadCasterViewController so now the new files that are added into your project are 
ListenerViewController.h ,ListenerViewController.m and
BroadCasterViewController.h , BroadCasterViewController.m





Step 2: Create the ListernerViewController and the BroadCasterViewController like the one given in the image above in the design phase. After that select the appdelegate.m file in your project and create the object of these two view controller classes and add them to the tabbarController here’s the code to do that



#import "Notification_DemoAppDelegate.h"
#import "BroadCasterViewController.h"
#import "ListenerViewController.h"

@implementation Notification_DemoAppDelegate
@synthesize window=_window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    BroadCasterViewController *broadCastObject = [[BroadCasterViewController alloc]init];
    ListenerViewController *listenerObject = [[ListenerViewController alloc]init];
    NSArray *objectArray = [[NSArray alloc]initWithObjects:listenerObject,broadCastObject, nil];
    UITabBarController *tabC = [[UITabBarController alloc]init];
    tabC.viewControllers = objectArray;
    [self.window addSubview:tabC.view];
    [self.window makeKeyAndVisible];
    return YES;
}

Step 3: Now it’s time to register our notification for the slider control (remember we are registering the notification here in the notification dispatch table with an appropriate name and with the help of this name we will refer the slider value and display the slider value onto the UILabel object in the ListenerViewController) Create a method in the BroadCasterViewController and assign this method to the sliders value changed event


BoradCasterViewController.h file code




#import <UIKit/UIKit.h>

@interface BroadCasterViewController : UIViewController {
   
     UISlider *_sliderView;
}
-(void)Register_Notification:(UISlider*)control;

@end

BoradCasterViewController.m file code




- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        _sliderView = [[UISlider alloc]initWithFrame:CGRectMake(18, 203, 284, 23)];
        _sliderView.minimumValue = 1.0f;
        _sliderView.maximumValue = 100.0f;
        [_sliderView addTarget:self action:@selector(Register_Notification:) forControlEvents:UIControlEventValueChanged];
        self.title = @"Broad cast";
    }
    return self;
}

now inside the function write this code



-(void)Register_Notification:(UISlider*)control
{
    [[NSNotificationCenter defaultCenterpostNotificationName:@"MySlider_Notification" object:control];
}

Code Explanation: 
postNotificationName: object: function is used to give your notification a name and register it with the object posting the notification in this case it will be the slider control as we have passed the slider reference as a parameter for the object.

This is all you have to do inorder to register a notification.

Step 4: Now once we are done with registering the notification, we will code for the observer who is observing this notification i.e the listener of this notification. So select the ListenerViewController.h file and create a function (we will come to the explanation of this function later)




-(void)ReadSliderValue:(NSNotification*)notification;

Now after the declaration of this function its time to give body to this function inside the ListenerViewController.m file, here's the code to do that




-(void)ReadSliderValue:(NSNotification*)notification
{
    UISlider *slider = [notification object];
    _sliderValueLabel.text = [NSString stringWithFormat:@"%.f",slider.value];
                       
}

Code Explanation: The above method has a parameter which is the object of the NSNotification class and this class has an object method which itself is called as object which returns the object associated with a particular notification in this case UISlider.

The main moto of the demo is that when you will select the tab of the BroadCasterView and slide the slider then in that case a notification must be registered and when you again come to the ListenerView then you must see the sliders value in the label, so we have to read the data from the dispatch table for the slider and assign it to the label in such a way so that when the user selects the ListenerView then he must see the changed value of the slider through the dispatch table so for doing this you have to add in one small piece of code in the ListenerViewControllers init method which is given below.

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


Code Explanation: The addObserver method of the NSNotifficationCenter class is used to add an observer for the notification in the dispatch table with a selector, which performs an appropriate action when the said notification is triggered, here we will be reading the value of the slider control present in the BroadCastViewController in the ListenerViewController.




Step 5: Run the app and get the output like the one given in the below image









You can even add more than one notification at a time here's a view at the same demo that i have explained above and this time i am using the switch control as well to determine whether the switch is on or off via notification, here's a view at the output 







I hope that this post has helped you in solving your queries regarding the simple display of the notification, in my next post i will be displaying working with the UILocalNotifcation until then happy iCoding and have a great day.  

17 comments:

  1. thanks, that was a nice introduction :)

    ReplyDelete
  2. please add this [self.view addSubview:_sliderView];

    Thanks for the tutorial :)

    ReplyDelete
  3. thanks..i was confused with nsnotificationCentre..

    ReplyDelete
  4. Nice tutorial but its not working....Can you send the code

    ReplyDelete
  5. Anonymous: Send me your ID and i shall mail you the code.

    @All: Your welcome and thanks

    ReplyDelete
  6. @Radix : bro can you send me that code ..

    my email id is mohit27bisht@gmail.com

    ReplyDelete
  7. My ID is RT@LOOPBUM.COM

    I'm very interested I making the Broadcaster my iPod Touch 4th Gen
    And the Listener my iPad2 or vice-versa.

    They both use my local Time Capsule Wi-Fi / I have job interview tomm. & that would really help my chances a lot.

    ReplyDelete
  8. Hi

    Thank you very much for this tutorial. I am new to iphone development and i understood very easily notification concept in less time by studying this tutorial. I am interested to know graphics basics in ios application. can you share any information on this please

    ReplyDelete
  9. Hi,
    I tried it but could not figure out why it isnt working. Can you send me your code so that i can see whats wrong ?
    my emailid is : testvdh@gmail.com

    ReplyDelete
  10. I got it...thanks anyways :)

    ReplyDelete
  11. please provide how to use push notification in ios

    ReplyDelete
  12. can you please send me your code !

    ReplyDelete
  13. I have Slider in 1st tab and label in 2nd tab, then at the first time I am not getting anything, How can I Get it at the First time...?

    ReplyDelete