iOS:不会调用委托(delegate)回调

标签 ios objective-c callback delegates

问题是并不是所有的委托(delegate)方法都会被调用。

登录.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

登录.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:@"john.doe@hmail.con" 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 未在登录 Controller 上调用。我的目标是构建一个相互调用的回调方法链。

最佳答案

问题是调用者“self.delegate”到“self”。将旧版本的 commitLogin 替换为

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

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

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

关于iOS:不会调用委托(delegate)回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34491114/

相关文章:

iOS 13 : Searchbar crashing when cancel is hit repeatedly

ios - 从 iPhone 发送图像作为表单数据的一部分

ios - GLKit 移动相机时一个物体移动奇怪

ios - 使用 x-apple-reminder ://to launch the Reminders app in iOS

objective-c - 如何更正 "Undefined symbols for architecture i386: "_main"链接问题?

objective-c - @IBAction : Fall Back to Default Behavior

ios - 回调方法不在 Swift 中从 UIView 调用到 ViewController

android - Fragment 中处理信息的通知 Activity

javascript - 如何在等待多个异步 JSONP 回调时显示加载消息?

php - 当应用程序未在 swift 中运行时,iOS 会收到来自 google GCM 的推送通知