2010-03-31 5 views
0

MailComposer를 시작하는 클래스를 만들었 기 때문에 다양한 종류의 전자 메일을 생성 할 때 내 iPhone 응용 프로그램이 한 곳만 남을 수 있습니다. 사전 채워진 주소가있는 것도 있고 그렇지 않은 주소도 있습니다.iPhone MailComposer 클래스 UIViewController dismissModalViewControllerAnimated issues

클래스가 UIViewController를 구현하는 것을 원하지 않지만 MailComposer의 대리인이 될 수 있도록해야합니다. 그렇지 않으면, 내 클래스를 호출하는 뷰 컨트롤러는 MailComposer의 위임자가되어야합니다.

내 클래스가 뷰 컨트롤러가되는 단점은 ModComposer를 모달 식으로 가져 오기 전에 화면에로드해야한다는 것입니다. 불행하게도 뷰 컨트롤러는 투명 할 수 없습니다. 그 효과는 MailComposer가 나타나기 전에 화면에 무엇이 있든 잠시 동안 단색의 흰색보기 컨트롤러로 덮히는 것입니다.

필자는 MailComposer가 사라진 후에 화면을 차지하는 빈보기 컨트롤러가 남아 있습니다. 나는이 호출하여 자체 내에서 제거 할 수 있어야한다고 :

[self.parentViewController dismissModalViewControllerAnimated:NO]; 

을하지만 그건 끔찍한 죽음을 죽는다 :

내 클래스가 "...로드 43365 개 스택 프레임을"- 미리 채우고 MailComposer를 시작하는 UIViewController - parentViewController의 손실 된 트랙? 내가 그것을 테스트했기 때문에 그것은 무효가 아닙니다. MailComposer 멀리 갈 수 있도록 방법을, 그리고 그렇게하려면, : 오류 : didFinishWithResult을 :

현재 뷰 컨트롤러 내에서 실행으로

... 클래스 내부

// My class is called Email. 
Email *oEmail = [[[Email alloc] init] retain]; 
// Red, to remind myself that I'd like to someday learn to make it transparent. 
oEmail.view.backgroundColor = [UIColor redColor]; 
// Pre-fill whatever fields you want, and specify attachments. 
oEmail.EmailSubject = @"I am truly stumped"; 
// This has to go on screen first. 
[self presentModalViewController:oEmail animated:NO]; 
// Then this can happen, which brings up the MailComposer. 
[oEmail f_SendEmail]; 
// Commenting out the next line didn't help, so I turned it back on. 
[oEmail release]; 

, 당신은 mailComposeController 필요 클래스는 MFMailComposeViewControllerDelegate 여야합니다. 여기에 무슨 일이 일어나는가 :

// This gets rid of the mail composer. 
[self dismissModalViewControllerAnimated:YES]; 

// This never fails to get rid of other modal view controllers when called 
// from within those controllers, but boy does it not work here. 
[self.parentViewController dismissModalViewControllerAnimated:NO]; 

당신이 나를 도울 수 있다면, 나는 정말로 감사 할 것입니다! 대신 나는 당신의 '이메일'컨트롤러에 대한 대리자를 설정합니다

[self.parentViewController dismissModalViewControllerAnimated:NO]; 

를 호출

+0

"43365 스택 프레임로드 중 ..."은 무한 재귀를 나타냅니다. 디버거를 살펴보면이 문제를 일으키는 방법의 사이클을보아야합니다. –

+1

또한 "보기 컨트롤러는 투명 할 수 없습니다"라는 것은 기술적으로 잘못되었습니다. 뷰 컨트롤러는 뷰의 논리를 관리하기위한 객체 일뿐입니다. 보기 자체는 투명, 반투명 또는 전체 화면이 아닐 수 있습니다. 당신이 말하는 것은 -presentModalViewController : animated : 메서드입니다.이 메서드는 컨트롤러의 뷰 뒤에서 불투명 한 흰색 뷰를 화면에 나타낼 때 나타납니다. –

답변

1

. 새 프로젝트를 만들 때 'FlipSide'애플리케이션 템플리트에서 이러한 연결 유형의 예를 볼 수 있습니다.

기본적으로, 당신은 이메일 컨트롤러에 대한 대리자를 설정합니다 : 전자 메일에 다음

Email *oEmail = [[[Email alloc] init] retain]; 
oEmail.view.backgroundColor = [UIColor redColor]; 
oEmail.EmailSubject = @"I am truly stumped"; 
[self presentModalViewController:oEmail animated:NO]; 
[oEmail f_SendEmail]; 
[oEmail setDelegate:self]; 
[oEmail release]; 

을 .H 파일 :

@protocol EmailDelegate 
-(void)emailDidFinish; 
@end 

@implementation Email : UIViewController { 
     // Other stuff 
     id <EmailDelegate> delegate; 
} 

@property (nonatomic, assign) id <EmailDelegate> delegate; 

@end 

당신이 대리자를 @synthesize 다음 때 '확인 닫을 준비가되었습니다. 전화 :

// This gets rid of the mail composer. 
[self dismissModalViewControllerAnimated:YES]; 

// This never fails to get rid of other modal view controllers when called 
// from within those controllers, but boy does it not work here. 
if (delegate && [delegate respondsToSelector:@selector(emailDidFinish)]){ 
    [delegate emailDidFinish]; 
} 

마지막으로 원래보기 컨트롤러에서 당신은 .h 파일에 다음을 가지고 있습니다 :

-(void)emailDidFinish { 
    [self dismissModal...]; 
} 

희망이 있습니다.

+0

나는 이것을 시험 할 것이다. 흥미 진진한. 저는 위임하는 것을 정말로 신경 쓰지 않습니다. 왜냐하면 다른 객체에 대한 책임을 넘겨야 만한다면 객체는 어떻게 실제로 포함될 수 있습니까? 그러나 MailComposer는 사용자 정의 코드를 추가 할 수있는 관련 코드 모듈이없는 Apple 작성 객체입니다. 그래서 우리는 다른 객체를 delegate로 만든 다음 거기에 코드를 작성할 수 있습니다. 문제는 MailComposer를 표시 할 수있는 모든 ViewController에이 코드를 삽입해야한다는 것입니다. 제안 된 솔루션이 테스트 할 때까지 해결되는지 여부를 알 수 없습니다. –

0

나는 동일한 문제가있어서 다른 방법으로 해결했습니다.

현재 ViewController를 팝하는 함수를 만들었습니다. 가 H에서 :

-(void)ics; 

cpp가에서 :

-(void)ics{ 
    //[self.navigationController popViewControllerAnimated:NO]; 
    [self.navigationController popToRootViewControllerAnimated:YES]; 
} 

은과 MailComposer를 기각 후라고 :

[self dismissModalViewControllerAnimated:YES]; 
[self ics]; 

짜잔!

관련 문제