2013-08-12 2 views
0

앱의 두 번째 화면에서 modalViewControlle r을 표시하고 싶습니다. 컨트롤러를 닫으면 첫 번째 화면으로 이동해야합니다. 아래 코드는 iPhone 4, 5 및 iPod Touch에서 잘 작동하지만 iPAD에서는 작동하지 않습니다. 목표는 내가 modalViewController을 닫을 때 두 번째 화면으로 돌아 가지 않아야하지만 첫 번째 화면을 표시해야합니다. 공유 이메일 클래스에서모달보기 컨트롤러가 닫히는 동안 앱이 깨집니다.

 ShareEmail *shareEmail = [[ShareEmail alloc] initWithNibName:[NSString stringWithFormat:@"%@",xibShareEmail] bundle:nil]; 

     shareEmail.fromWer = @"ownPer"; 
     [self presentModalViewController:shareEmail animated:NO]; 
     [shareEmail release]; 

     [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES]; 

[self dismissModalViewControllerAnimated:YES]; 
당신은 당신의 shareEmail보기 컨트롤러를 유지하기 위해 필요
+0

'shareEmail'을 아직 표시하지 않습니까? –

+1

우선, 사용되지 않는 메소드를 사용하고 있습니다. presentViewController : animated : 완료 및 dismissViewControllerAnimate : 완료를 사용해야합니다. 둘째, 모달 표시된 컨트롤러를 잘못된 클래스에서 제거하는 것입니다. 모달 컨트롤러를 표시하여 클래스를 닫는 것은 클래스의 책임입니다. 코드는 ShareEmail보기 컨트롤러 자체가 아니라 ShareEmail보기 컨트롤러를 할당하고 표시 한 클래스에 있어야합니다. 충돌을 해결할 수는 없지만, 다음 단계에 따라 문제의 원인을 제거하십시오. – petemorris

+0

릴리스는 괜찮습니다. 일반적으로 이러한 메서드에 전달 된 개체를 유지할 책임이 없습니다. 그러나 UIViewController 설명서는이 시점에서 명확하지 않으므로 autorelease를 사용하면 가장 안전 할 것입니다. ARC를 사용하는 것은 릴리스 당황의 가장 좋은 해결책이 될 것입니다! – petemorris

답변

0

흥미로운 일이 있습니다. self에서보기 컨트롤러를 표시하면 navigationController에서 뒤로 탐색을 수행하고 있습니다. 이 시점에서 나는 이전에 말하고 있던 self이 사라졌습니다.

presentViewController 메서드에서 popViewController 메서드를 제거하십시오.

또한 ^completion 핸들러 메소드를 사용해야합니다. 그것이 내비게이션 컨트롤러 pop 코드를 삽입해야하는 곳입니다.

-(void)present { 
    ShareEmail *email = [[ShareEmail... 
    //You'll need to get a weak reference to `self` in `email` 
    email.modalDelegate = self; //you need to make a property in ShareEmail 
    [self presentViewController:email animated:YES completion:nil]; 
    [email release]; 
} 

-(void)dismiss { 
    [self dismissViewControllerAnimated:YES completion:nil]; 
    [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES]; 
} 

//in ShareEmail.m 
[modalDelegate dismiss]; 
+0

코드에'-release'가있는 경우 호를 사용하지 않습니다.호에 마이 그 레이션해야한다.이 많은 것들을 더 쉽게 만든다. – Justin

+0

내가 호에 마이 그 레이션하면 iOS 5 이하를 지원하지 않을 것이다. 호와 함께 모든 iOS 버전을 어떻게 적용 할 수 있습니까? 어떤 생각? – dinesh

+0

iOS4는 ARC를 지원하지만 과 같은 모든 규칙을 지원하지는 않습니다. 어쨌든 많은 앱이 iOS4를 더 이상 지원하지 않는다고 생각합니다. 모든 '현재'기기는 iOS6 및 곧 iOS7을 지원합니다. 외로운 홀드 아웃은 iPad 1입니다. – Justin

1

- 합성 보존 재산

YourClass.h합니다

@property (nonatomic, retain) ShareEmail *shareEmailViewController; 

YourClass.m을 :

,

그런 다음하여 모달 뷰 컨트롤러를 표시 :

ShareEmail *shareEmail = [[ShareEmail alloc] initWithNibName:[NSString stringWithFormat:@"%@",xibShareEmail] bundle:nil]; 
self.shareEmailViewController = shareEmail; 
[self presentModalViewController:shareEmail animated:NO]; 
[shareEmail release]; 

보유 된 속성을 사용하는 동안 해제되는 뷰 컨트롤러를 유지합니다. 나중에 해고 할 때 그럼 당신은 할 수 있습니다 : 보유 된 속성을 해제하고 당신이 그것으로 완료 한 후 메모리를 해제합니다

[self.shareEmailViewController dismissModalViewControllerAnimated:YES]; 
self.shareEmailViewController = nil; 

합니다.

관련 문제