为什么我的委托方法在发送给委托后被发送到其父视图?

时间:2012-07-19 21:51:33

标签: objective-c ios delegates

我提前为问题标题道歉。我不太确定如何简洁地描述我的问题。

我遇到了这个我设置的委托方法的问题。我正在尝试以模态方式呈现一个简单的登录屏幕。我的问题是我的登录视图在我解除它之后得到一个调用它的方法。

具体来说,Xcode记录了这个:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[LoginViewController login:]: unrecognized selector sent to instance [memory address]'

LoginViewController.h

#import <UIKit/UIKit.h>

@protocol LoginViewControllerProtocol;

@interface LoginViewController : UIViewController

@property (weak, nonatomic) IBOutlet UITextField *userNameTextField;
@property (weak, nonatomic) IBOutlet UITextField *userPasswordTextField;
@property (weak, nonatomic) IBOutlet UIButton *loginButton;
@property (nonatomic, weak) NSObject<LoginViewControllerProtocol> *loginViewControllerDelegate;

@end


@protocol LoginViewControllerProtocol <NSObject>
- (void)loginViewController:(LoginViewController *)controller didLogin:(NSString *)userName;
@end

LoginViewController.m

- (IBAction)login
{
   if ([self.loginViewControllerDelegate respondsToSelector:@selector(loginViewController:didLogin:)]) {
        [self.loginViewControllerDelegate loginViewController:self didLogin:self.userNameTextField.text];              
    }
}

委托:( TestViewController.m)

- (void)loginViewController:(LoginViewController *)controller didLogin:(NSString *)userName
{
    [self dismissModalViewControllerAnimated: YES]; 
    didLogIn = YES;

}

我看不出为什么委托方法被发送回被解雇的视图。

非常感谢任何帮助!

编辑: 我为此而道歉。这发生在调用LoginViewController的视图控制器中。委托方法也存在于此处。

TestViewController.m

if (!didLogIn) {
        //launch login view modally
        LoginViewController* loginController = [[LoginViewController alloc] initWithNibName: @"LoginViewController" bundle: nil]; 
        loginController.loginViewControllerDelegate = self;
        loginController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
        loginController.modalPresentationStyle = UIModalPresentationFormSheet;

        NSLog(@"LoginViewControllerDelegate: %@", self.description);
        NSLog(@"LoginViewController: %@", loginController.description);
        [self presentModalViewController:loginController animated: YES];

TestViewController.h

#import <UIKit/UIKit.h>
#import "LoginViewController.h"

@class NuanceGuidHandler;

@interface TestViewController : UIViewController <LoginViewControllerProtocol>

@property (weak, nonatomic) IBOutlet UILabel *partnerGuidLabel;
@property (weak, nonatomic) IBOutlet UILabel *userGuidLabel;
@property (strong, nonatomic) NuanceGuidHandler *nuanceGuidHandler;
@property (nonatomic) BOOL didLogIn;
@end

2 个答案:

答案 0 :(得分:1)

代表的事情是红鲱鱼。

  

* 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [LoginViewController登录:]:无法识别的选择器发送到实例[内存地址]'

意味着类LoginViewController的对象已发送消息login:,它不知道如何处理。

您已将操作与名为login:的方法相关联,并且在您的控制器中,您的操作定义为login。任何医生都会告诉你,结肠是最重要的。断开连接并重新连接界面构建器中的操作,或从

更改登录方法签名
- (IBAction)login

- (IBAction)login:(id)sender

答案 1 :(得分:0)

您似乎正在做以下两件事之一:

  1. 当您使用模态视图控制器时,您似乎没有在任何地方声明您的代理人。

    modalviewcontroller.delegate = self

  2. 我不确定这是否会导致问题,但您在LoginViewController.h中有双重协议声明。这在过去与我的委托内容混淆了,它可能会也可能不会导致您的问题。