2017-12-20 13 views
2

UIStoryboard있는 UITableView 함께 설치되어있는보기 컨트롤러가 있습니다. UITableView는 네면에서 컨트롤러의 SafeArea로 제한됩니다.viewDidLayoutSubviews 빈 메서드에 대한 무한 루프에 붙어

이 질문은 이전에 묻는 것처럼 보일 수 있지만 질문을 발견 할 때마다 루프가 발생하는 viewDidLayoutSubviews에서 변경 사항이 발생하기 때문입니다. blank viewDidLayoutSubviews 및 기본 UITableViewCells (nib 없음) 구현이 있습니다. 그러나 iOS 11, Xcode 9.2에서는 tableview를 flicking하면 무한 루프에서 viewDidLayoutSubviews가 호출됩니다. 나는 이런 일이 어떻게 내 인생을 알아낼 수 없습니다

- (void)viewDidLayoutSubviews { 

    NSLog(@"viewDidLayoutSubviews"); 
    [super viewDidLayoutSubviews]; 
} 

: 이것은 내 구현입니다.

편집 : 컨트롤러에는 NavigationController가 있으며 iAdSuite 예제의 BannerViewController에 포함 된 UISplitViewController의 마스터 컨트롤러입니다.

편집 : 시뮬레이터의 모든 기기에서 iOS 11 (최대 11.2)에서 발생합니다. iOS 10.3을 사용하지 마십시오. viewDidLayoutSubviews은 iOS 10.3에서도 호출되지 않습니다. UISplitViewController/BannerViewController 대신 UIViewController/TableView와 함께 Nav Controller를 사용하면 동일한 결과를 얻습니다. 그래서이 문제는 iOS 11에서 일어난 일이 아닌 것 같습니다.

편집 : 그래서 이것은 이상합니다 - 네비게이션 컨트롤러에 큰 제목이 선택되었을 때만 발생하는 것처럼 보입니다!

편집 :이 문제는 쉽게 재현 할 수 있습니다. Apple의 iAd Suite 샘플 코드를 다운로드하고 SplitNavigationController 프로젝트를 사용했습니다. 스토리 보드를 업데이트하여 안전 영역 레이아웃 가이드를 사용하는 것을 포함하여 iOS 11 용 프로젝트를 업데이트했습니다. MasterViewController를 UITableViewController에서 UITableView로 UIViewController로 변경했습니다. UIViewController는 스토리 보드의 안전 영역 레이아웃 가이드로 제한되었습니다. MasterTextController에 largeTitleDisplayMode와 largeTitleDisplayMode를 추가했습니다. viewDidLayoutSubviews 메서드에 NSLog 문을 추가하여이 동작을 쉽게 관찰 할 수 있습니다. 저는 이것이 iOS 11의 진짜 문제라고 생각합니다. 그리고 나는 그것의 바닥에 도달하려고 노력할 것이고, 다른 누군가가 어떤 생각이나 제안을 제공 할 수 있다면 감사 할 것입니다.

편집 : 매트는이 문제를 재현하고 다음 링크에서 찾을 수하는 GitHub의 프로젝트에 게시 할 수 있었다 (감사 매트!) : 당신이 버그를 발견 한 것처럼 InfiniteLayoutSubviewsBug

+1

"어떻게 멈추게 할까?"한 가지 간단한 생각 : 그렇게하지 마십시오. 또한 지구상에서 "하위 클래스가 아닌 뷰 컨트롤러가 있습니다"는 의미는 무엇입니까? – matt

+0

여기에 무한 루프가 무엇을 의미하는지 자세히 설명해 주시겠습니까? 앱이이 메소드를 실행하는 것을 정지합니까? –

+1

github에 예제를 게시 할 수 있습니까? 귀하의 설명에 따라 재현 할 수 없습니다. 그것은 아마도 불법적 인 일을하고있는 것처럼 보입니다. 불법적 인 부모보기 컨트롤러 배치 등이있는 것 같습니다. 나는 "viewDidLayoutSubviews"를 호출하기 위해 "tableview를 가볍게 치기"를 기대하지 않을 것이다. – matt

답변

2

것 같습니다. 나는 여기 GitHub의에 게시 한 최소한의 예제 프로젝트에 문제를 재현 할 수 있었다 :

https://github.com/mattneub/InfiniteLayoutSubviewsBug

프로젝트를 다운로드하고 실행합니다. 세 개의 행이있는 간단한 테이블을 볼 수 있습니다. 테이블 뷰 을 위로 스크롤하여 위로 이동하십시오. 콘솔을보십시오. 우리는 viewDidLayoutSubviews으로 전화를 되풀이하고 있습니다. 1/60 초마다 한 번씩, 영원히.

코드에서 재귀 적 레이아웃 루프로 인해 이 아니고이 아닌 점에 유의하십시오. 제 예제는 super으로 전화하지 않습니다. 로그뿐입니다. 이것은 런타임 자체입니다viewDidLayoutSubviews 반복적으로 영원히. 이 상황이 발생하는 동안 당사 코드 (print 제외)가 실행되지 않습니다.

다른 관찰 탐색 모음 큰 제목을 사용하지 않도록 당신이 예를 변경하는 경우

당신이 바르게 관찰
  • 가, 문제가 사라집니다.

  • 테이블보기가 autolayout을 사용하여 배치되지 않도록 예제를 변경하면 문제가 사라집니다.

  • 보기 컨트롤러가 UITableViewController 하위 클래스가되도록 예제를 (좀 더 정교하게) 변경하면 문제가 사라집니다. viewDidLayoutSubviews으로 전화를 되풀이하지만 영원히는 아니며 스크롤하는 동안 표시됩니다.

+0

나는 두 번째 또는 세 번째 해결책을 좋아한다. Apple의 수정 사항이있을 때까지 큰 제목을 모두 가져가는 것이 좋습니다. 정말 고마워, 매트! – SAHM

+0

또한 내 세 번째 점을 참조하십시오 – matt

+0

사과로 버그를 신고하지 않으면이 문제가 해결되지 않습니다 ... – matt