tags:

views:

66

answers:

0

I have some twitter code I modified from: http://amanpages.com/sample-iphone-example-project/twitteragent-tutorial-tweet-from-iphone-app-in-one-line-code-with-auto-tinyurl/

His code used view alerts to login and post to twitter but I wanted to change mine to use windows. It is mostly working and I can login and post to Twitter. However, when I try to post a second time, the program crashes with a: Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[NSCFString text]: unrecognized selector sent to instance 0xc2d560'

I'm a bit of a coding newbie so any help would be appreciated. If I need to post more code, ask.

#import "TwitterController.h"
#import "xmacros.h"

#define XAGENTS_TWITTER_CONFIG_FILE DOC_PATH(@"xagents_twitter_conifg_file.plist")

static TwitterController* agent;

@implementation TwitterController

BOOL isLoggedIn;

@synthesize parentsv, sharedLink;


-(id)init
{
self = [super init];

maxCharLength = 140;
parentsv = nil;

isLogged = NO;
isLoggedIn = NO;

txtMessage = [[UITextView alloc] initWithFrame:CGRectMake(30, 225, 250, 60)];
UIImageView* bg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"fb_message_bg.png"]];
bg.frame = txtMessage.frame;

lblCharLeft = [[UILabel alloc] initWithFrame:CGRectMake(15, 142, 250, 20)]; 
lblCharLeft.font = [UIFont systemFontOfSize:10.0f]; 
lblCharLeft.textAlignment = UITextAlignmentRight;
lblCharLeft.textColor = [UIColor whiteColor]; 
lblCharLeft.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0]; 

txtUsername = [[UITextField alloc]initWithFrame:CGRectMake(125, 190, 150, 30)]; 
txtPassword = [[UITextField alloc]initWithFrame:CGRectMake(125, 225, 150, 30)]; 
txtPassword.secureTextEntry = YES; 

lblId = [[UILabel alloc]initWithFrame:CGRectMake(15, 190, 100, 30)]; 
lblPassword = [[UILabel alloc]initWithFrame:CGRectMake(15, 225, 100, 30)];
lblTitle = [[UILabel alloc]initWithFrame:CGRectMake(80, 170, 190, 30)];
lblId.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0]; 
lblPassword.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0];
lblTitle.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0]; 
lblId.textColor = [UIColor whiteColor]; 
lblPassword.textColor = [UIColor whiteColor]; 
lblTitle.textColor = [UIColor whiteColor];  

txtMessage.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0]; 

lblId.text = @"Username:"; 
lblPassword.text =@"Password:";
lblTitle.text = @"Tweet This Message";
lblId.textAlignment = UITextAlignmentRight; 
lblPassword.textAlignment = UITextAlignmentRight; 
lblTitle.textAlignment = UITextAlignmentCenter;

txtUsername.borderStyle = UITextBorderStyleRoundedRect; 
txtPassword.borderStyle = UITextBorderStyleRoundedRect; 

txtMessage.delegate = self; 
txtUsername.delegate = self; 
txtPassword.delegate = self; 

login = [[UIButton alloc] init];
login = [UIButton buttonWithType:UIButtonTypeRoundedRect];
login.frame = CGRectMake(165, 300, 100, 30);
[login setTitle:@"Login" forState:UIControlStateNormal];
[login addTarget:self action:@selector(onLogin) forControlEvents:UIControlEventTouchUpInside];

cancel = [[UIButton alloc] init];
cancel = [UIButton buttonWithType:UIButtonTypeRoundedRect];
cancel.frame = CGRectMake(45, 300, 100, 30);
[cancel setTitle:@"Back" forState:UIControlStateNormal];
[cancel addTarget:self action:@selector(onCancel) forControlEvents:UIControlEventTouchUpInside];

post = [[UIButton alloc] init];
post = [UIButton buttonWithType:UIButtonTypeRoundedRect];
post.frame = CGRectMake(165, 300, 100, 30);
[post setTitle:@"Post" forState:UIControlStateNormal];
[post addTarget:self action:@selector(onPost) forControlEvents:UIControlEventTouchUpInside];

back = [[UIButton alloc] init];
back = [UIButton buttonWithType:UIButtonTypeRoundedRect];
back.frame = CGRectMake(45, 300, 100, 30);
[back setTitle:@"Back" forState:UIControlStateNormal];
[back addTarget:self action:@selector(onCancel) forControlEvents:UIControlEventTouchUpInside];


loading1 = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
loading1.frame = CGRectMake(140, 375, 40, 40);
loading1.hidesWhenStopped = YES;
[loading1 stopAnimating];

loading2 = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
loading2.frame = CGRectMake(140, 375, 40, 40);
loading2.hidesWhenStopped = YES;
[loading2 stopAnimating];

twitterWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

[twitterWindow addSubview:txtUsername];
[twitterWindow addSubview:txtPassword];
[twitterWindow addSubview:lblId];
[twitterWindow addSubview:lblPassword];
[twitterWindow addSubview:login];
[twitterWindow addSubview:cancel];
[twitterWindow addSubview:loading1];

UIImageView* logo = [[UIImageView alloc] initWithFrame:CGRectMake(35, 165, 48, 48)];
logo.image = [UIImage imageNamed:@"Twitter_logo.png"];
[twitterWindow addSubview:logo];

[logo release];

twitterWindow2 = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

[twitterWindow2 addSubview:lblTitle];
[twitterWindow2 addSubview:lblCharLeft];
[twitterWindow2 addSubview:bg];
[twitterWindow2 addSubview:txtMessage];
[twitterWindow2 addSubview:lblURL];
[twitterWindow2 addSubview:post];
[twitterWindow2 addSubview:back];
[twitterWindow2 addSubview:loading2];
[twitterWindow2 bringSubviewToFront:txtMessage];

UIImageView* logo1 = [[UIImageView alloc] initWithFrame:CGRectMake(35, 155, 42, 42)];
logo1.image = [UIImage imageNamed:@"twitter-logo-twit.png"];
[twitterWindow2 addSubview:logo1];

[logo1 release];

twitterWindow.hidden = YES;
twitterWindow2.hidden = YES;

return self;
}

-(void) onStart
{
[[UIApplication sharedApplication]setStatusBarOrientation:UIInterfaceOrientationPortrait];
twitterWindow.hidden = NO;
[twitterWindow makeKeyWindow];

[self refresh];

if(isLogged)
{
    twitterWindow.hidden = YES;
    twitterWindow2.hidden = NO;
    [twitterWindow2 makeKeyWindow];
}
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
[textField becomeFirstResponder];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return NO;
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
const char* str = [text UTF8String];

int s = str[0];
if(s!=0)
    if((range.location + range.length) > maxCharLength){
        return NO;
    }else{
        int left = 139 - ([sharedLink length] + [textView.text length]);
        lblCharLeft.text= [NSString stringWithFormat:@"%d",left];


        // this fix was done by Jackie
        //http://amanpages.com/sample-iphone-example-project/twitteragent-tutorial-tweet-from-iphone-app-in-one-line-code-with-auto-tinyurl/#comment-38026299
        if([text isEqualToString:@"\n"]){
            [textView resignFirstResponder];
            return FALSE;
        }else{
            return YES;
        }
    }

int left = 139 - ([sharedLink length] + [textView.text length]);
lblCharLeft.text= [NSString stringWithFormat:@"%d",left];
return YES;
}

-(void) onLogin
{
[loading1 startAnimating];

NSString *postURL = @"http://twitter.com/statuses/update.xml";
NSString *myRequestString = [NSString stringWithFormat:@""];

NSData *myRequestData = [ NSData dataWithBytes: [ myRequestString UTF8String ] length: [ myRequestString length ] ];
NSMutableURLRequest *request = [ [ NSMutableURLRequest alloc ] initWithURL: [ NSURL URLWithString:postURL ] ];
[ request setHTTPMethod: @"POST" ];
[ request setHTTPBody: myRequestData ];

NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:request delegate:self];
if (!theConnection) {
    UIAlertView* aler = [[UIAlertView alloc] initWithTitle:@"Network Error" message:@"Failed to Connect to twitter" delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil];
    [aler show];
    [aler release];
}      
[request release];
}

-(void) onCancel
{
[[NSUserDefaults standardUserDefaults] setValue:@"NotActive" forKey:@"Twitter"];
twitterWindow.hidden = YES;
[[UIApplication sharedApplication]setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
}

-(void) onPost 
{
[loading2 startAnimating];

NSString *postURL = @"http://twitter.com/statuses/update.xml";
NSString *myRequestString;
if(sharedLink){
    myRequestString = [NSString stringWithFormat:@"&status=%@",[NSString stringWithFormat:@"%@\n%@",txtMessage.text,sharedLink]];
}else{
    myRequestString = [NSString stringWithFormat:@"&status=%@",[NSString stringWithFormat:@"%@",txtMessage.text]];
}

NSData *myRequestData = [ NSData dataWithBytes: [ myRequestString UTF8String ] length: [ myRequestString length ] ];
NSMutableURLRequest *request = [ [ NSMutableURLRequest alloc ] initWithURL: [ NSURL URLWithString:postURL ] ];
[ request setHTTPMethod: @"POST" ];
[ request setHTTPBody: myRequestData ];

NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:request delegate:self];
if (!theConnection) {
    UIAlertView* aler = [[UIAlertView alloc] initWithTitle:@"Network Error" message:@"Failed to Connect to twitter" delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil];
    [aler show];
    [aler release];

}      
[request release];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
// release the connection, and the data object
[connection release];
if(isAuthFailed){
    UIAlertView* aler = [[UIAlertView alloc] initWithTitle:@"Login Failed" message:@"Invalid ID/Password" delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil];
    [aler show];
    [aler release];
}else{
    UIAlertView* aler = [[UIAlertView alloc] initWithTitle:@"Connection Failed" message:@"Failed to connect to Twitter" delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil];
    [aler show];
    [aler release];

}

isAuthFailed = NO;
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
isAuthFailed = NO;

[loading1 stopAnimating];
[loading2 stopAnimating];

if(isLogged)
{
    UIAlertView* aler = [[UIAlertView alloc] initWithTitle:@"Twitter" message:@"Tweet Posted!" delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil];
    [aler show];
    [aler release];

    txtMessage = @"";
    [self refresh];
}

else
{
    twitterWindow.hidden = YES;
    twitterWindow2.hidden = NO;
    [[NSNotificationCenter defaultCenter] postNotificationName:@"notifyTwitterLoggedIn" object:nil userInfo:nil];
}

isLogged = YES;
isLoggedIn = YES;
}

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSDictionary* config = [NSDictionary dictionaryWithObjectsAndKeys:txtUsername.text,@"username",txtPassword.text,@"password",nil];
[config writeToFile:XAGENTS_TWITTER_CONFIG_FILE atomically:YES];
if ([challenge previousFailureCount] == 0) {
    NSURLCredential *newCredential;
    newCredential=[NSURLCredential credentialWithUser:txtUsername.text
                                             password:txtPassword.text
                                          persistence:NSURLCredentialPersistenceNone];
    [[challenge sender] useCredential:newCredential
           forAuthenticationChallenge:challenge];
} else {
    isAuthFailed = YES;
    [[challenge sender] cancelAuthenticationChallenge:challenge];
}
}

-(void) refresh
{
NSDictionary* config = [NSDictionary dictionaryWithContentsOfFile:XAGENTS_TWITTER_CONFIG_FILE];
if(config){
    NSString* uname = [config valueForKey:@"username"];
    if(uname){
        txtUsername.text = uname;
    }

    NSString* pw = [config valueForKey:@"password"];
    if(pw){
        txtPassword.text = pw;
    }

}
}

+ (TwitterController*)defaultAgent{
if(!agent){
    agent = [TwitterController new];
}
return agent;
}       

-(void)dealloc 
{
[super dealloc];

[txtMessage release];
[txtUsername release];
[txtPassword release];

[lblId release];
[lblPassword release];
[lblURL release];

[twitterWindow2 release];
[twitterWindow release];
}


@end