2010-07-21 8 views
11

난 그냥 아이폰 개발 로 시작하고 난 탭 응용 프로그램이 내가 모달 그래서 내가 여기 Apple Dev 보았다 형태의 로그를 표시하고 싶었 내보기 컨트롤러 중 하나 내부에 이런 짓을 내가 연결 다음과 같은 조치를 버튼 :이있는 모달 뷰 컨트롤러

#import "LoginForm.h" 
... 
-(IBAction)showLogin{ 
LoginForm *lf = [[LoginForm alloc]initWithNibName:@"LoginForm" bundle:nil]; 
lf.delegate = self; 
lf.modalPresentationStyle = UIModalTransitionStyleCrossDissolve; 
[self presentModalViewController:lf animated:YES]; 
} 

나는 내가 두 번째 줄을 제거하면 , 그것은 빌드 '가 아닌 구조 또는 노동 조합이 뭔가 멤버'위임 '에 대한 요청을 "얻을 수 있지만 버튼을 누르면 않습니다 구축 아무것도.

무엇이 여기에 있습니까?

+0

나는 ViewBased 응용 프로그램에 동일한 코드를 사용하는 경우 내가 두 번째 줄에서 동일한 오류가 발생하지만, 내가 선을 제거하면 내가 버튼을 누를 때 모달 뷰가 나타납니다. 대표단에게 특별한 것이 필요합니까? 탭이있는 템플릿의 경우? – irco

답변

19

로그인 폼에 delegate 회원을 신고하지 않은 것 같습니다. LoginForm이 완료되면 LoginForm을 모달로 표시하는 UIViewController 인스턴스를 사용할 수 있도록 코드를 추가해야합니다. LoginForm.h에서

: LoginForm.m에서

@class LoginForm; 

@protocol LoginFormDelegate 
- (void)loginFormDidFinish:(LoginForm*)loginForm; 
@end 

@interface LoginForm { 
    // ... all your other members ... 
    id<LoginFormDelegate> delegate; 
} 

// ... all your other methods and properties ... 

@property (retain) id<LoginFormDelegate> delegate; 

@end 

: 여기에 자신의 위임을 선언하는 방법은 LoginForm을 제시의 UIViewController 인스턴스에 다음

@implementation 

@synthesize delegate; 

//... the rest of LoginForm's implementation ... 

@end 

을 (의가 MyViewController 호출하자) :

In MyViewController.h :

@interface MyViewController : UIViewController <LoginFormDelegate> 

@end 
MyViewController.m에서 6,

:

/** 
* LoginFormDelegate implementation 
*/ 
- (void)loginFormDidFinish:(LoginForm*)loginForm { 
    // do whatever, then 
    // hide the modal view 
    [self dismissModalViewControllerAnimated:YES]; 
    // clean up 
    [loginForm release]; 
} 

- (IBAction)showLogin:(id)sender { 
    LoginForm *lf = [[LoginForm alloc]initWithNibName:@"LoginForm" bundle:nil]; 
    lf.delegate = self; 
    lf.modalPresentationStyle = UIModalTransitionStyleCrossDissolve; 
    [self presentModalViewController:lf animated:YES]; 
} 
+0

정말 고마워요.이게 내가 찾고 있던 것입니다. 프로토콜 선언 내에서 마지막으로 말한 것은 내가 알 수없는 것입니다. "예상 됨") 'LoginForm보다 앞에' 나는 그다지 잘못 보지 않습니다. 귀하의 코드와 유일한 차이점은 내 양식이 UIViewController에서 상속된다는 것입니다,하지만 그것은 그 오류와 관련된 것 같지 않아요 – irco

+0

내 나쁜 ... 프로토콜 선언 앞에'@class LoginForm; '을 잊어 버렸습니다. 내 대답에서 소스를 편집했습니다.이 프로토콜을 볼 수 있도록 –

+0

덕분에, 나는 또한 MyViewController에서 가져 오기를했고, 이유를이 컴파일하지만 여전히 콘솔가 캐치되지 않는 예외 'NSInvalidArgumentException'을 보여줍니다 ShowLogin 함수의 첫 번째 줄을 타격하기 전에 충돌 : '- [UIViewController showLogin] : 인스턴스로 전송 된 인식 할 수없는 선택기 0x5936080' – irco

0

LoginForm 클래스는 UIViewController에서 파생 된 것으로 보입니다. UIViewController 클래스에는 delegate 속성이 없으므로 컴파일 오류가 발생했습니다.

문제는 처음에는 조치가 호출되지 않을 가능성이 높습니다. 적절한 조치의 서명은 다음과 같습니다.

- (IBAction)showLogin:(id)sender; 

sender 인수가 필요합니다. 메서드에 중단 점을 넣어 호출되는지 확인하십시오.

+0

loginForm에 대한 대리자를 어떻게 선언합니까? 그리고 네, 당신이 맞았다 고 생각합니다. 중단 점이 맞지 않습니다. – irco

+0

올바르지 않습니다. 액션 메소드는 0 매개 변수 또는 하나의 매개 변수 (컨트롤 전송)를 취할 수 있으며 Interface Builder는 행복하게 (IBAction) doWhatever 메소드까지 컨트롤을 연결합니다. –