어흥
[Objective - C] Segue사용시 발생할 수 있는 에러 본문
문제점: Present Modally나 다른 세그웨이로 화면을 전환했는데 다음 화면이 전체 화면이 아닌 경우(A vc ->B vc)
- +버튼을 눌러서 화면을 전환하고자 할 때 다음과 같이 전체 화면으로 표시되지 않는다
[위의 문제로 인해 발생하는 문제]
가정) 아래와 같은 코드가 작성되어있다
- A vc.m에는 viewWillAppear 함수가 구현되어 있다
- B vc.m에는 Save버튼을 눌렀을 때 dismissViewControllerAnimated 코드가 작성되어 있다
//A vc.m
-(void)viewWillAppear:(BOOL)animated {
NSLog(@"Appeared!!");
[super viewWillAppear:animated];
[self.tableView reloadData]; //메모리스트를 갱신하는 코드
}
//B vc.m
- (IBAction)save:(id)sender {
NSString* memo = self.memoTextView.text;
MemoData* newMemo = [[MemoData alloc] initWithContent:memo];
[[MemoData dummyMemoList] addObject:newMemo];
[self dismissViewControllerAnimated:YES completion:nil]; //이전 화면으로 돌아가는 코드
}
문제점 : B vc에서 [Save] 버튼을 눌러도 A vc에 존재하는 메모리스트가 갱신되지 않는다
[위의 문제가 발생되는 원인]
- 뷰컨트롤러 라이프 사이클에 대해서 알고 있어야 한다
아무리 찾아봐도 viewWillAppear에서 선언하면 잘 되는것 같다. 하지만 안된다. 이유는?
-> Save 버튼을 눌러서 B vc가 사라지고 A vc가 사라져도 viewWillAppear가 호출되지 않았다.
viewWillAppear의 애플 개발문서를 찾아본다
developer.apple.com/documentation/appkit/nsviewcontroller/1434415-viewwillappear?language=occ
위와 같이 화면에 보이지 않았다가 나타난 경우에만 호출된다. 즉, B vc가 A vc를 완벽히 덮지 못했기 때문에 호출이 안된다
전체 화면으로 보이도록 바꾸는 코드
//둘 모두 prepareForSegue 함수에 구한하면 된다
//Swift
let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen //or .overFullScreen for transparency
self.present(vc, animated: true, completion: nil)
//Objective-C
[vc setModalPresentationStyle: UIModalPresentationFullScreen]; //위의 4번째줄 대신 작성
[수행 결과]
: 꽉찬 화면으로 인해 Save 버튼을 누르면 viewWillAppear 함수가 정상 작동하여 메모리스트가 갱신된것을 확인할 수 있다
참조한 사이트
- stackoverflow.com/questions/56435510/presenting-modal-in-ios-13-fullscreen
'iOS' 카테고리의 다른 글
[Objective - C] 키보드 이벤트 (0) | 2020.10.26 |
---|---|
[Objective - C] 프로젝트 기본 설정 (0) | 2020.10.20 |
[Objective - C] 기본 예제(종합) (0) | 2020.10.19 |
[Objective - C] 아카이빙 (0) | 2020.10.16 |
[Objective-c] Collection (0) | 2020.10.16 |