【发布时间】:2012-07-19 21:51:33
【问题描述】:
我提前为问题标题道歉。我不太清楚如何简洁地描述我的问题。
我设置的这个委托方法有问题。我正在尝试以模态方式呈现一个简单的登录屏幕。我的问题是我的登录视图在我关闭它后得到了一个调用它的方法。
具体来说,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
【问题讨论】:
-
你在哪里以及如何设置你的委托?
-
您没有显示委托值的设置位置。此外,在操作方法中间关闭 viewController 是一个非常糟糕的主意。为什么不使用调度到主队列并在那里执行(这样登录控制器将处于静止状态。)
-
委托方法未发送回已关闭的视图。
login:方法是。通常 IBAction 方法在头文件中声明,例如:-(IBAction)login:(id)sender。您是如何将您的loginButton连接到login:方法的?还有什么叫login:吗? -
在发送委托的方法中,我创建了一个新的 LoginViewController 实例,将它连接到 nib,并将 te 委托设置为 self。我使用界面生成器中的 ctrl-drag 选项连接按钮。没有其他东西调用这个方法。我会尝试重新连接笔尖中的所有内容。
标签: objective-c ios delegates