2012-12-19 3 views
2

팝업 효과를 얻으려고하고 다른 뷰 컨트롤러에서 팝업 뷰를 디자인하여 xib로 할 수 있습니다.다른 뷰 컨트롤러의 뷰를 서브 뷰로 추가하기

presentViewController 또는 pushViewController를 사용하여 배경을 투명하게 설정하면 결국 배경색이 보입니다.

정보보기가 투명한 배경으로 전체 화면을 가릴 수 있도록이 코드를 탐색 컨트롤러의보기에 추가했습니다. 나는 또한 은폐 할 수있는 탭 바를 가지고있다.

InfoVC *vc = [[InfoVC alloc] initWithNibName:@"InfoVC" bundle:nil]; 
[self.navigationController.view addSubview:vc.view]; 

내 문제는 내가 그것을 해제하려고 할 때 앱이 어떤 EXC_BAD_ACCESS 메시지와 함께 충돌합니다 내 InfoVC 내부 :

나는 충돌을 중지하는 방법을 발견 : 편집

[self.view removeFromSuperview]; 

InfoVC를 MainVC의 속성으로 설정합니다. 충돌의 이유는 InfoVC 내부의 조치에서 "self.view"라고 부르는 것입니다. 자기 자신이 MainVC 내부의 InfoVC라는 것을 알지 못합니다.

+1

xib에서보기를 만들려면 다른보기 컨트롤러가 필요하지 않습니다. 단지보기 일 뿐인 xib을 가질 수 있습니다. 자,이 관점에서 무엇을하는지에 따라 자체 컨트롤러가 있어야 할 수도 있지만 필요하지는 않습니다. – rdelmar

+0

보기가있는 xib입니다. 내 생각 엔이게 바로 나야. 이것이 어떻게 사용될 수 있는지 보여주는 튜토리얼이 있습니까? – Jim

+0

자습서가 필요한 이유는 무엇입니까? "New File"을 선택하고 유형으로 "사용자 인터페이스"를 선택한 다음 "보기"를 선택하십시오. – rdelmar

답변

1

슈퍼 뷰에서보기를 제거하려면 다음을 사용해야합니까?

[vc.view removeFromSuperview]; 
2
InfoVC *vc = [[InfoVC alloc] initWithNibName:@"InfoVC" bundle:nil]; 
[self.navigationController.view addSubview:vc.view]; 

아니오 아니오 아니오 아니오. 절대로 그렇게하지 마십시오.

뷰 컨트롤러의 뷰를 다른 뷰 컨트롤러의 뷰에 배치하거나 (나중에 제거해야하는) 정교한 춤이 있습니다.이 작업을 수행하는 데 기본 제공되는 기능이 없으면 UISplitViewController, 또는 내비게이션 컨트롤러가 푸시되고 그 안에 푸시 된 뷰 컨트롤러의 뷰를 관리하는 방식).

고객 컨테이너 컨트롤러를 읽습니다. 내 책의 예 중 하나는 여기에 있습니다 : 뷰 컨트롤러가 제거됩니다 지금 발표 뷰 컨트롤러에서 뷰를 등장 제시 "모달"후

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/ch19p556containerController/p476containerController/ViewController.m

+0

고마워요, 그래서 내가하는 일은 바른 길에 있지 않습니다. – Jim

+0

나는 이것을 명심 할 것이다. 아직 내 자신의 컨테이너를 만들 준비가 안됐어. = D – Jim

+0

그런 다음보기를 사용하고 추가보기 컨트롤러를 빠져 나간다. 뷰를 다른 뷰에서 쉽게 팝핑 할 수 있습니다. 이 과정에서 뷰 컨트롤러를 오용하지 마십시오. – matt

1

; 이렇게하면 메모리가 절약되고 렌더링이 쉬워집니다. 당신의 경우에도, 그러나, 당신은 또한 "모달"제시된보기 뒤의 창문을 보게됩니다.

자연스럽고 논리적 인 다음 단계는 하나의보기 컨트롤러보기를 가져 와서 다른보기 컨트롤러로 밀어 넣는 것입니다. 그러나, 당신이 발견 한대로, 이것은 문제가 있습니다. 새로 삽입 된 뷰가 뷰 계층에 안전하게 보관 되어도 안전하지만 새로운 뷰 컨트롤러는 그리 운이 좋지 않으므로 신속하게 할당이 취소됩니다. 따라서이 새로운보기가 컨트롤러에 연결하려고하면 EXC_BAD_ACCESS이 표시되고 충돌이 발생합니다. 한 가지 해결 방법은 다시 원래보기 컨트롤러가 새로운보기 컨트롤러에 대한 강력한 참조를 유지하도록하는 것입니다. 그리고 이것은 ... 나쁘게 작동 할 수 있습니다. UIViewControllerHierarchyInconsistencyException을 얻을 수있는 좋은 기회가 아직 있습니다.

물론 IB로 만든 작은보기를 추가하려는 경우보기 컨트롤러를 "File's Owner"으로 사용할 필요가 없으며 xib 파일에서보기의 인스턴스를 만드는 많은 예가 있습니다 .

더 흥미로운 질문은 "사과는 어떻게 할 것인가?"입니다. Apple은 View Controller가 캡슐화 된 작업 단위 (UU)의 올바른 컨트롤러라고 일관되게 말합니다. 예를 들어, TWTweetComposeViewController, 당신은 그것을 제시하고, 떠 다니는 것 같습니다. 어떻게?

이 작업을 수행하는 첫 번째 방법은 명확하지 않은 명확한 배경을 갖는 것입니다. 즉, 제공된보기 제어기가 나타나기 전에 화면 이미지를 작성하고 제시보기가 제거되기 전에이를 배경으로 설정하십시오. 그래서 (예를 들어 설명 따르도록) :

enter image description here

QuickSheetViewController.h

#import <UIKit/UIKit.h> 
@interface QuickSheetViewController : UIViewController 
- (IBAction)dismissButtonPressed:(id)sender; 
@end 

QuickSheetViewController.m

,691

QuickSheetViewController.xib을

#import "QuickSheetViewController.h" #import <QuartzCore/QuartzCore.h> @implementation QuickSheetViewController { UIImage *_backgroundImage; } -(void)renderAndSaveBackgroundImageFromVC:(UIViewController *)vc{ UIGraphicsBeginImageContext(vc.view.bounds.size); [vc.view.layer renderInContext:UIGraphicsGetCurrentContext()]; _backgroundImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; // save an image of the current view, and set our background to clear so we can see the slide-in. [self renderAndSaveBackgroundImageFromVC:self.presentingViewController]; self.view.backgroundColor = [UIColor clearColor]; } -(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; // Time to use our saved background image. self.view.backgroundColor = [UIColor colorWithPatternImage:_backgroundImage]; } -(void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; // Set our background to clear so we can see the slide-out. self.view.backgroundColor = [UIColor clearColor]; } - (IBAction)dismissButtonPressed:(id)sender { [self dismissViewControllerAnimated:YES completion:nil]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ return (interfaceOrientation == UIInterfaceOrientationPortrait); } @end 

이 예제의 대부분은 renderAndSaveBackgroundImageFromVC: 메서드를 사용합니다. 그래픽 컨텍스트를 작성하여 화면에 표시 할 뷰를 렌더링 한 다음 나중에 (viewDidAppear)을 배경으로 사용합니다.

이제 단순히 좋아 사용 : 당신은 그냥 충분히 애니메이션이 발생하는 배경을 통해 볼 수

QuickSheetViewController *newVC = [[QuickSheetViewController alloc] initWithNibName:nil bundle:nil]; 
[self presentViewController:newVC animated:YES completion:nil]; 

, 우리가 제시보기의 제거를 숨기기 위해 우리의 저장된 이미지를 사용합니다.

관련 문제