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

问题描述:

我提前道歉问题标题。我不太清楚如何简洁地描述我的问题。为什么我的委托方法在发送给委托后被发送到其父视图?

我在设置这个委托方法时遇到了麻烦。我试图以模态方式呈现一个简单的登录屏幕。我的问题是我的登录视图得到一个方法后,我解雇它。

具体而言,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 
+0

在哪里,你是如何设置您的代理? – EsbenB 2012-07-19 21:54:20

+0

您不显示委托值的设置位置。另外,在操作方法中关闭viewController是一个非常糟糕的主意。为什么不使用派遣到主队列并在那里执行(因此登录控制器将处于静默状态)。 – 2012-07-19 21:59:58

+0

委派方法不会被发送回关闭的视图。 'login:'方法是。通常,IBAction方法在头文件中声明为:' - (IBAction)login:(id)sender'。你是如何将'loginButton'连接到'login:'方法的?还有其他的事情叫'login:'吗? – 2012-07-19 22:09:31

代表事情是一个红色的鲱鱼。

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

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

您已将操作连接到名为login:的方法,并且在您的控制器中,您的操作定义为login。正如任何医生会告诉你的,冒号是非常重要的。无论是断开并重新在Interface Builder中的动作,或更改

- (IBAction)login 

登录方法签名

- (IBAction)login:(id)sender 
+0

那就是它。我检查了我的笔尖,这两个都存在。我删除了不应该的,它的作品。谢谢! – darius 2012-07-20 13:40:57

你似乎在做两件事情之一:

  1. 你似乎并不被宣告你的当你使用模态视图控制器时,可以随时随地进行委派。

    modalviewcontroller.delegate =自

  2. 我不知道这是否是引起问题或不是,但你必须在LoginViewController.h双协议声明。这已经和我过去的代理工作搞混了,它可能会或可能不会导致你的问题。

+0

“双”协议声明不是问题。恰恰相反。它告诉编译器,委托实际上是一个有效的类型,并且稍后将被定义。 – EsbenB 2012-07-19 22:05:16

+1

在开始尝试回答问题之前,您可能需要学习更多的Obj-C - 2称为“前向声明”,并且在使用中非常常见 - 事实上,对于此代码来说,这是必要的,因为他的协议是在*该代表被宣布。 – CrimsonDiego 2012-07-19 22:05:33

+0

我很抱歉,我忘了包括我设置的方法。我将用这些信息更新我的问题。 – darius 2012-07-20 12:40:28