2012-07-19 68 views
0

我提前道歉問題標題。我不太清楚如何簡潔地描述我的問題。爲什麼我的委託方法在發送給委託後被髮送到其父視圖?

我在設置這個委託方法時遇到了麻煩。我試圖以模態方式呈現一個簡單的登錄屏幕。我的問題是我的登錄視圖得到一個方法後,我解僱它。

具體而言,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

回答

1

代表事情是一個紅色的鯡魚。

*終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',原因: ' - [LoginViewController登錄:]:無法識別的選擇發送到實例[存儲器地址]'

指類的對象LoginViewController已發送消息login:,它不知道如何處理。

您已將操作連接到名爲login:的方法,並且在您的控制器中,您的操作定義爲login。正如任何醫生會告訴你的,冒號是非常重要的。無論是斷開並重新在Interface Builder中的動作,或更改

- (IBAction)login 

登錄方法簽名

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

那就是它。我檢查了我的筆尖,這兩個都存在。我刪除了不應該的,它的作品。謝謝! – darius 2012-07-20 13:40:57

0

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

  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

相關問題