2012-06-12 2 views
1

두 개의보기 컨트롤러가있는 앱이 있습니다. ViewControllerA는 탭 제스처가 지정된 빈보기로, 사용자가보기 탭으로 탭 꼭지점에서 UITextView를 만들 수 있습니다. 사용자는 원하는만큼의 UITextView를 만들 수 있으며 뷰에 프로그래밍 방식으로 추가 할 수 있습니다 (ViewControllerA).스토리 보드에서보기를 다시로드하면 프로그램 적으로 추가 된 iOS 하위보기가 손실됩니다.

사용자가 텍스트 글꼴 및 스타일을 변경할 수있는 버튼도 있습니다. 그러면 Segue가 두 번째 View Controller ViewControllerB로 트리거되어 사용자가 Font, Text Size, Color 등을 설정할 수 있습니다. 완료되면 사용자는 ViewControllerB에서 DONE 버튼을 클릭하고 다른 Segue는 초기보기 (ViewControllerA)로 다시 전환합니다.

이 모든 것이 정상적으로 작동합니다. 사용자가 ViewControllerB에서 초기보기 (ViewControllerA)로 다시 전환 할 때를 제외하고보기는 스토리 보드에서 다시로드되고 프로그래밍 방식으로 추가 한 하위보기는 사라집니다.

보기 (ViewControllerA) ViewDidLoad 및 ViewWillAppear는 문제가없는 것처럼 보이기 때문에 첫 번째 불시가 발생했을 때 처음보기가 해제되고 전환시 스토리 보드에서 다시 생성되지만 서브 뷰는 포함되지 않습니다. 프로그래밍 방식으로 추가 한 이후로 스토리 보드에 없기 때문입니다.

기본보기 (ViewControllerA)가 다시로드 될 때 하위보기가 다시 만들어 지도록이 문제를 해결하는 방법에 대한 권장 사항이 있습니까?

의견을 보내 주셔서 감사합니다.

답변

1

질문에서 들린다 . 텍스트 스타일보기에 모달 구석이 있어야하고 모달보기 컨트롤러가 없어 졌으므로 원래 인스턴스로 돌아갑니다.

1

다른 사람들이 해결책이 필요한 경우에 대비하여 다음과 같이 해결했습니다.

툴바를 제외하고 기본보기의 크기 인 ViewControllerA에서 하위보기를 만들었습니다. 나는 이것을 canvasView라고 부른다. 그런 다음이 캔버스보기에 모든 ImageViews 및 TextViews를 추가합니다.

그런 다음 ViewControllerA viewWillDisappear에서 canvasView와 모든 하위 뷰를 이와 같은 파일에 보관합니다.

NSString *archivePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"Canvas.archive"]; 
BOOL result = [NSKeyedArchiver archiveRootObject:_canvasView 
            toFile:archivePath]; 
if (!result) { 
    NSLog(@"Archive failed to archivePath %@",archivePath); 
} 

그런 다음 ViewControllerA에 viewWillAppear에서 나는 기존 아카이브가 있는지 확인하고 그래서 올바른 순서로 하위 뷰를로드하는 다시로드합니다. 그렇지 않으면 빈 캔버스 뷰를 이와 같이 만듭니다. 그것은 그런 식으로 작동하지 않는 대상 VC의 새로운 인스턴스을 항상 segues - 당신이 스타일을 볼 텍스트, "원래에"다음 다른 SEGUE에 SEGUE 있었다처럼

// If the collageView already exists then restore it from the achive, otherwise initialize a new one. 

NSString *archivePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"Canvas.archive"]; 

_canvasView = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath]; 

if (_canvasView) { 
    // Restore existing canvasView 
    [_backgroundView addSubview:_canvasView]; 
} else { 
    // Initialize a new canvasView 
    _canvasView = [[UIScrollView alloc] initWithFrame:CGRectMake(_backgroundView.frame.origin.x, 
                  _backgroundView.frame.origin.y, 
                  _backgroundView.frame.size.width, 
                  _backgroundView.frame.size.height)]; 
    [_backgroundView addSubview:_canvasView]; 
} 
+1

사실 나는 당신이 그것을 지나치게 복잡하게했다고 생각합니다. 질문에서 당신은 텍스트 스타일 뷰에 대한 segue를 가졌고, "원래의 것으로 돌아가는"또 다른 segue를 가지고있는 것처럼 들리지만, 그것은 작동하지 않습니다. segues는 항상 대상 VC의 새로운 인스턴스를 만듭니다. 텍스트 스타일보기에 모달 구석이 있어야하고 모달보기 컨트롤러가 없어 졌으므로 원래 인스턴스로 돌아갑니다. – jrturton

+0

많은 분들께 감사드립니다. jrturton은 더 나은 솔루션이며 완전히 보관해야 할 필요성을 없애줍니다. –

+0

답변으로 추가했습니다. – jrturton

관련 문제