2010-05-13 3 views
0

Так что я очень новичок в этом материале разработки iphone .... и я застрял.iphone app: делегат не отвечает

Я создаю приложение, которое подключается к twitter api. Однако при вызове метода connectionDidFinishLoading он, похоже, не признает делегата.

Вот исходный код класса запроса:

#import "OnePageRequest.h" 

@implementation OnePageRequest 

@synthesize username; 
@synthesize password; 
@synthesize receivedData; 
@synthesize delegate; 
@synthesize callback; 
@synthesize errorCallBack; 
@synthesize contactsArray; 

-(void)friends_timeline:(id)requestDelegate requestSelector:(SEL)requestSelector{ 
    //set the delegate and selector 
    self.delegate = requestDelegate; 
    self.callback = requestSelector; 

    //Set up the URL of the request to send to twitter!! 
    NSURL *url = [NSURL URLWithString:@"http://twitter.com/statuses/friends_timeline.xml"]; 

    [self request:url]; 
} 

-(void)request:(NSURL *) url{ 

    theRequest = [[NSMutableURLRequest alloc] initWithURL:url]; 
    theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

    if (theConnection){ 
     //Create the MSMutableData that will hold the received data. 
     //receivedData is declared as a method instance elsewhere 
     receivedData=[[NSMutableData data] retain]; 
    }else{ 
     //errorMessage.text = @"Error connecting to twitter!!"; 
    } 
} 

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{ 

    if ([challenge previousFailureCount] == 0){ 
     NSLog(@"username: %@ ",[self username]); 
     NSLog(@"password: %@ ",[self password]); 
     NSURLCredential *newCredential = [NSURLCredential credentialWithUser:[self username] 
                    password:[self password] 
                   persistence:NSURLCredentialPersistenceNone]; 
     [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge]; 
    } else { 
     [[challenge sender] cancelAuthenticationChallenge:challenge]; 
     NSLog(@"Invalid Username or password!"); 
    } 
} 

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 

    [receivedData setLength:0]; 

} 

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 

    [receivedData appendData:data]; 

} 

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 

    [theConnection release]; 
    [receivedData release]; 
    [theRequest release]; 

    NSLog(@"Connection failed. Error: %@ %@", [error localizedDescription], [[error userInfo] objectForKey:NSErrorFailingURLStringKey]); 

    if(errorCallBack){ 
     [delegate performSelector:errorCallBack withObject:error]; 
    } 
} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ 

    if (delegate && callback){ 
     if([delegate respondsToSelector:[self callback]]){ 
      [delegate performSelector:[self callback] withObject:receivedData]; 
     }else{ 
      NSLog(@"No response from delegate!"); 
     } 
    } 
    [theConnection release]; 
    [theRequest release]; 
    [receivedData release]; 
} 

Вот .h:

@interface OnePageRequest : NSObject { 

    NSString *username; 
    NSString *password; 
    NSMutableData *receivedData; 
    NSURLRequest *theRequest; 
    NSURLConnection *theConnection; 
    id delegate; 
    SEL callback; 
    SEL errorCallBack; 
    NSMutableArray *contactsArray; 
} 

@property (nonatomic,retain) NSString *username; 
@property (nonatomic,retain) NSString *password; 
@property (nonatomic,retain) NSMutableData *receivedData; 
@property (nonatomic,retain) id delegate; 
@property (nonatomic) SEL callback; 
@property (nonatomic) SEL errorCallBack; 
@property (nonatomic,retain) NSMutableArray *contactsArray; 

-(void)friends_timeline:(id)requestDelegate requestSelector:(SEL)requestSelector; 
-(void)request:(NSURL *) url; 

@end 

В методе: connectionDidFinishLoading, следующее никогда не будет выполнена:

[delegate performSelector:[self callback] withObject:receivedData]; 

Вместо этого я получаю сообщение: «Нет ответа от делегата»

Кто-нибудь видит, что я делаю неправильно ?! или что может быть причиной проблемы?

+0

Привет, Фиона, пожалуйста, отредактируйте свой вопрос, чтобы правильно форматировать код. Просто выберите раздел кода и используйте кнопку «код», чтобы он автоматически отступал. – ohhorob

ответ

0
[delegate performSelector:[self callback] withObject:receivedData]; 

(К сожалению, мой комментарий о SEL аргументах был связан с трудностями чтения коды вставленной в вопрос.)

с помощью отладчика в connectionDidFinishLoading: вы можете проверить, что delegate и callback переменные не ноль?


обратного вызова извлекается он имеет значение: friends_timeline_callback, что и я бы ожидать

Следующий шаг состоит в проверке, что селектор на самом деле правильно. то есть, если метод обратного вызова имеет аргумент, он должен быть @selector(friends_timeline_callback:) (отметьте конечный символ :, чтобы указать, что аргумент является частью подписи метода)

+0

Привет, ohhorob .. при отладке, следующий оператор: if ([делегат отвечаетSoSelector: [self callback]]) перед выполнением: обратный вызов выходит за рамки ... однако, когда этот оператор выполняется и возвращается значение обратного вызова он имеет значение: friends_timeline_callback, чего я ожидаю. – Fiona

Смежные вопросы