2015-12-28 129 views
1

問題是並非所有的委託方法都被調用。iOS:委託回調不會被調用

Login.h

#import <Foundation/Foundation.h> 
@protocol LTLoginDelegate; 

@interface LTLogin : NSObject 

@property(nonatomic, weak) id <LTLoginDelegate> delegate; 

-(void)commitLogin:(NSString*)login password:(NSString*)password; 
-(void)login:(LTLogin*)login didBecomeActive:(BOOL)success; 
-(void)login:(LTLogin*)login didFailWithError:(NSError*)error; 
-(void)login:(LTLogin*)login didSuccessWithMessage:(NSString*)message; 

-(void)storeLoginCredentials; 

@end 

@protocol LTLoginDelegate <NSObject> 

@optional 
-(void)storeLoginCredentials; 
-(void)login:(LTLogin*)login didSuccessStoringCredentials:(BOOL)success; 
-(void)login:(LTLogin*)login didFailStoringCredentials:(BOOL)success; 

@required 
-(void)login:(LTLogin*)login didBecomeActive:(BOOL)success; 
-(void)login:(LTLogin*)login didFailWithError:(NSError*)error; 
-(void)login:(LTLogin*)login didSuccessWithMessage:(NSString*)message; 

@end 

Login.m

@implementation LTLogin 

-(void)commitLogin:(NSString *)login password:(NSString *)password { 

    // >>> .... 
    if([self.delegate respondsToSelector:@selector(login:didBecomeActive:)]) { 

     [self.delegate login:self didBecomeActive:YES]; 
    } 
} 


-(void)login:(LTLogin *)login didBecomeActive:(BOOL)success { 

    // >>> .... 
    // Don't get called here at all!!!!!! 
    [self.delegate login:self didSuccessWithMessage:@"Success"]; 
} 

-(void)login:(LTLogin *)login didSuccessWithMessage:(NSString *)message { 


} 

@end 

Controller.m或者

-(void)viewDidAppear:(BOOL)animated { 

#if LOG == 0 
    NSLog(@"This one"); 
#endif 

    LTLogin *login = [[LTLogin alloc]init]; 
    login.delegate = self; 
    [login commitLogin:@"[email protected]" password:@"123123"]; 
} 

-(void)login:(LTLogin *)login didFailWithError:(NSError *)error { 

#if LOG == 1 
    NSLog(@"login didFailWithError: Error %@",error); 
#endif 

} 

-(void)login:(LTLogin *)login didSuccessWithMessage:(NSString *)message { 

#if LOG == 1 
    NSLog(@"login didSucceedWithMessage: %@",message); 
#endif 

} 

-(void)login:(LTLogin *)login didBecomeActive:(BOOL)success { 

#if LOG == 1 
    NSLog(@"login didBecomeActive"); 
#endif 
// Gets called here only!!!!!! 

} 

didBecomeActive沒有被調用登錄控制器上。我的目標是建立一系列可以相互呼叫的回調方法。

+0

爲什麼你不使用塊? –

+0

因爲這次我想使用代表。 – NCFUSN

+0

你可以嘗試更改方法的名稱 - (無效)登錄:(LTLogin *)登錄didBecomeActive:(BOOL)Login.m類中的成功,因爲委託中有一個方法具有相同的名稱? – Arun

回答

1

問題是調用者「self.delegate」爲「self」。用

替換老版本
-(void)commitLogin:(NSString *)login password:(NSString *)password { 

    // >>> .... 
    if([self.delegate respondsToSelector:@selector(login:didBecomeActive:)]) { 

     [self login:self didBecomeActive:YES]; 
    } 
} 
+0

否然後我沒有得到主控制器收到通知。 – NCFUSN

+0

如果LOG標誌打開,我在主控制器上收到「login didSucceedWithMessage:Success」消息。如果你想通知主控制器上的成員,你可以添加呼叫「[self.delegate login:self didBecomeActive:YES];」以「登錄:(LTLogin *)登錄didBecomeActive:(BOOL)成功」方法。 – bunty

+0

或者你應該移動「[self.delegate login:self didSuccessWithMessage:@」Success「];」方法「登錄:(LTLogin *)登錄didSuccessWithMessage:(NSString *)消息」,並把這一行「[self.delegate登錄:自我didBecomeActive:是];」代替。 – bunty

1

方法-(void)login:(LTLogin *)login didBecomeActive:(BOOL)success將僅在當前委託中被調用。在-(void)viewDidAppear:(BOOL)animated中,您將其設置爲Controller。如果您想要有多個代表,可以使用observer patternNSNotificationCenter。請記住添加您的控制器和LTLogin實例。

+0

通知是簡單的解決方案,但我不希望他們。我想要很好的代表。 – NCFUSN

+0

你可以使用NSHashTable來存儲多個委託。 NSHashTable可以初始化爲弱存儲元素。請查看https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSHashTable_class/#//apple_ref/occ/clm/NSHashTable/weakObjectsHashTable瞭解更多詳情 – ksysu