【问题标题】:iOS: Delegate callbacks won't get callediOS:不会调用委托回调
【发布时间】:2015-12-28 09:45:29
【问题描述】:

问题是并不是所有的委托方法都被调用了。

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

控制器.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 不会在登录控制器上被调用。我的目标是构建一个相互调用的回调方法链。

【问题讨论】:

  • 为什么不使用block?
  • 因为我这次要使用委托。
  • 您可以尝试更改方法的名称 -(void)login:(LTLogin *)login didBecomeActive:(BOOL)success 在 Login.m 类中,因为委托中有同名的方法?
  • 我认为您对代码的工作方式感到困惑。当你调用 [login commitLogin:@"john.doe@hmail.con" 密码:@"123123"];从 Controller.m,控制器转到 Login.m 中的相同方法。从此方法控制将返回到 Controller.m 中的 -(void)login:(LTLogin *)login didBecomeActive:(BOOL)success。
  • 是的,它完全按预期工作,为什么需要回调链,我认为您可能有更好的解决方案,而不是链接所有内容.....

标签: ios objective-c callback delegates


【解决方案1】:

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

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

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

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

【讨论】:

  • 没有。然后我没有收到主控制器通知。
  • 如果 LOG 标志打开,我在主控制器上收到“login didSucceedWithMessage: Success”消息。如果您想在主控制器上通知 becomeActive,您可以添加调用“[self.delegate login:self didBecomeActive:YES];”到“login:(LTLogin *)login didBecomeActive:(BOOL)success”方法。
  • 或者你应该移动行“[self.delegate login:self didSuccessWithMessage:@"Success"];"到方法“login:(LTLogin *)login didSuccessWithMessage:(NSString *)message”并把这一行“[self.delegate login:self didBecomeActive:YES];”而是。
【解决方案2】:

方法-(void)login:(LTLogin *)login didBecomeActive:(BOOL)success 只会在当前委托上被调用。在-(void)viewDidAppear:(BOOL)animated 中,您将其设置为Controller。如果您想拥有多个代表,您可以使用observer patternNSNotificationCenter。请记住同时添加您的控制器和 LTLogin 实例。

【讨论】:

猜你喜欢
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多