为什么我的委托方法在发送给委托后被发送到其父视图?
我提前道歉问题标题。我不太清楚如何简洁地描述我的问题。为什么我的委托方法在发送给委托后被发送到其父视图?
我在设置这个委托方法时遇到了麻烦。我试图以模态方式呈现一个简单的登录屏幕。我的问题是我的登录视图得到一个方法后,我解雇它。
具体而言,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
代表事情是一个红色的鲱鱼。
*终止应用程序由于未捕获的异常 'NSInvalidArgumentException',原因: ' - [LoginViewController登录:]:无法识别的选择发送到实例[存储器地址]'
指类的对象LoginViewController
已发送消息login:
,它不知道如何处理。
您已将操作连接到名为login:
的方法,并且在您的控制器中,您的操作定义为login
。正如任何医生会告诉你的,冒号是非常重要的。无论是断开并重新在Interface Builder中的动作,或更改
- (IBAction)login
登录方法签名
- (IBAction)login:(id)sender
那就是它。我检查了我的笔尖,这两个都存在。我删除了不应该的,它的作品。谢谢! – darius 2012-07-20 13:40:57
你似乎在做两件事情之一:
-
你似乎并不被宣告你的当你使用模态视图控制器时,可以随时随地进行委派。
modalviewcontroller.delegate =自
我不知道这是否是引起问题或不是,但你必须在LoginViewController.h双协议声明。这已经和我过去的代理工作搞混了,它可能会或可能不会导致你的问题。
“双”协议声明不是问题。恰恰相反。它告诉编译器,委托实际上是一个有效的类型,并且稍后将被定义。 – EsbenB 2012-07-19 22:05:16
在开始尝试回答问题之前,您可能需要学习更多的Obj-C - 2称为“前向声明”,并且在使用中非常常见 - 事实上,对于此代码来说,这是必要的,因为他的协议是在*该代表被宣布。 – CrimsonDiego 2012-07-19 22:05:33
我很抱歉,我忘了包括我设置的方法。我将用这些信息更新我的问题。 – darius 2012-07-20 12:40:28
在哪里,你是如何设置您的代理? – EsbenB 2012-07-19 21:54:20
您不显示委托值的设置位置。另外,在操作方法中关闭viewController是一个非常糟糕的主意。为什么不使用派遣到主队列并在那里执行(因此登录控制器将处于静默状态)。 – 2012-07-19 21:59:58
委派方法不会被发送回关闭的视图。 'login:'方法是。通常,IBAction方法在头文件中声明为:' - (IBAction)login:(id)sender'。你是如何将'loginButton'连接到'login:'方法的?还有其他的事情叫'login:'吗? – 2012-07-19 22:09:31