Friday, January 11, 2013

Creating a Twitter application in ios

Twitter is an online social networking service and microblogging service that enables its users to send and read text-based messages of up to 140 characters, known as "tweets". It's quite popular nowadays since people likes to update the world about what they are currently doing, what they found interesting today, how they feel the day and so on as little tweets.

Why I am telling these info to you is that now we are going to discuss an ios app which you can install in your iphone to tweet easily without visiting twitter site. The types of tweets that we are going to use is limited but the way we do that is interesting. 

The following image shows how the design should be done. 

what actually happens here is, we are going to have a Picker view with two columns( user can select two items from each column), that helps to form your tweet saying how are you today and how do you feel about that. So, all what the user has to do is to select them and click on Tweet it! button to post a tweet in his/her twitter page. Simple, but interesting.

once you are done with the design, don't forget to set the UIPickerView data source and delegate to the picker view we have here.
OK, I'll jump to the code now. 

//  InstaTwitViewController.h

#import <UIKit/UIKit.h>

@interface InstaTwitViewController : UIViewController

//we are going to use the UIPickerView datasource and delegate methods

    IBOutlet UIPickerView *tweetPicker;  //two objects to hold the controls
    IBOutlet UITextView *notesField;       
    NSArray *activities;     //two arrays to hold the two parts of the tweet
    NSArray *feelings;
@property(nonatomic,retain)UIPickerView *tweetPicker;
@property(nonatomic,retain)UITextView *notesField;

-(IBAction)sendButtonTapped:(id)sender; //method to sent the tweet


Now, we'll see how these can be implemented.

#import "InstaTwitViewController.h"

@implementation InstaTwitViewController

@synthesize tweetPicker,notesField;

- (void)dealloc
    [activities release];
    [feelings release];
    [tweetPicker release];
    [notesField release];
    [super dealloc];

- (void)didReceiveMemoryWarning
    [super didReceiveMemoryWarning];

#pragma mark - View lifecycle

//this method will be invoked when the app loads for the first time
//we are going to make two NSArrys named activities and feelings and store a collection of related strings
- (void)viewDidLoad
activities=[[NSArray alloc]initWithObjects:@"sleeping",@"eating",@"working",@"thinking",@"crying",@"begging",@"leaving",@"shopping",@"hello worlding", nil];

feelings=[[NSArray alloc]initWithObjects:@"awsome",@"sad",@"happy",@"ambivalent",@"nauseous",@"psyched",@"confused",@"hopeful",@"anxious", nil];

    [super viewDidLoad];

- (void)viewDidUnload
    [super viewDidUnload];

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    return (interfaceOrientation == UIInterfaceOrientationPortrait);

//-------------------UIPickerView datasouce methods-----------------------------------------------------
// returns the number of 'columns' to display.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
    return 2;

// returns the # of rows in each component..
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component

 //we need the number of elements in the activities array to be the number of rows in the first column 
//(here you call it component)

        return [activities count];

//we need the number of elements in the feelings array to be the number of rows in the first column 
        return [feelings count];  

//-------------------UIPickerView delegate methods-----------------------------------------------------
//to set values for each cell of the UIPickerView
//we use a switch block here to see to which column we are addressing at the moment
//if it is component 0 then have to pass the rowth element of the activities array 
//if component 1, do the same with the feelings array

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
    switch (component) 
        case 0:
            return [activities objectAtIndex:row];
        case 1:
            return [feelings objectAtIndex:row];
    return nil;

//this method will be called if the user selects items from each of the columns of the picker view

//get each comlumn's selction to variables

    NSString *selectedAcivity=[activities objectAtIndex:[tweetPicker selectedRowInComponent:0]];
    NSString *selectedFeeling=[feelings objectAtIndex:[tweetPicker selectedRowInComponent:1]];
//format the tweet

 NSString *message=[[NSString alloc]initWithFormat:@"%@ I'm %@ and feeling %@ about it.",notesField.text ? notesField.text :@"",selectedAcivity,selectedFeeling];
//display the   
  //TWITTER API starts here to pass our message to twitter
NSMutableURLRequest *theRequest=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@""]

    [theRequest setHTTPMethod:@"POST"];

    [theRequest setHTTPBody:[[NSString stringWithFormat:@"status=%@",
                              message] dataUsingEncoding:NSASCIIStringEncoding]];

    NSURLResponse* response;
    NSError* error;
    NSData* result = [NSURLConnection sendSynchronousRequest:theRequest
                                           returningResponse:&response error:&error];

    NSLog(@"%@", [[[NSString alloc] initWithData:result
                                        encoding:NSASCIIStringEncoding] autorelease]);


//this method will send the onscreen key board way when clicked on return button in it

    [sender becomeFirstResponder];


Now you can build and run your app. I also have made available the project source code for you. 

you can observe the output below. You have to keep one more thing here, if you are using the simulator to test this app, you will see the processing javascripts in the log only. if you test this in a device, your tweets will be posted in your twitter wall