내 앱을 시뮬레이션 할 때이 문제가 발생합니다. 오류나 경고는 아니지만 내 콘솔에 나타납니다. 이전에이 문제를 경험 한 사람이 있습니까?
내 앱을 시뮬레이션 할 때이 문제가 발생합니다. 오류나 경고는 아니지만 내 콘솔에 나타납니다. 이전에이 문제를 경험 한 사람이 있습니까?
답변:
제 경우에는 테이블 뷰에서 두 개의 탭을 매우 빠르게 클릭하면이 오류가 발생합니다.
그 결과 잘못된 제목 이름이 발생하고 뒤로 버튼이 사라집니다. 누군가 뷰를 푸시 할 때 set animated:NO
. 오류가 사라지지만 여전히 이상한 동작이 발생합니다. 두 개의 뷰를 푸시 한 다음 테이블 뷰 화면으로 돌아가려면 두 번 뒤로 돌아 가야합니다.
이 문제를 해결하기 위해 시도한 방법 :
더하다 BOOL cellSelected;
에 viewWillAppear
cellSelected = YES;
didselectcell 델리게이트에서 if (cellSelected){cellSelected = NO; do action ; }
이렇게하면 두 개의 다른 셀을 매우 빠르게 클릭하는 것을 방지 할 수 있습니다.
제 경우에는 항목의 메서드 [self performSegueWithIdentifier:@"SomeIdentifier" sender:self];
내에서 트리거 할 때 발생했습니다 .UINavigationController
viewDidLoad
그것을 viewDidAppear
방법 으로 옮기면 문제가 해결되었습니다.
그 이유는 viewDidLoad
모든 멋진 애니메이션이 이미 완료된 것은 아니지만 모든 것이 완료 되었기 viewDidAppear
때문입니다.
나도이 문제가있다. 이 문제에 대한 두 가지 해결책을 찾았습니다.
UINavigationController
이 문제가 해결 된 하위 클래스를 찾았습니다 . 버퍼링 된 탐색 컨트롤러이를 방지하려면 다른 루프에서 코드를 실행해야합니다.
double delayInSeconds = 0.1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// Put your code here
[self presentViewController:self.yourModalVC animated:YES completion:nil];
});
dispatch_async
을 주 대기열에 포함하는 것입니다. 문제 dispatch_async
는 메인 대기열의 다른 모든 애니메이션이 완료 될 때까지 대기한다는 것입니다. 다음과 같은 이유로 지연을 사용하는 것보다 훨씬 낫습니다. 1- 지연이 충분한 지 결코 알 수없고, 호스트 장치에 따라 다릅니다. 2- 지연을 과도하게 사용하고 무언가 지연 될 수 있습니다. 이 시도 :dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
내비게이션 컨트롤러를 사용하여 동일한 문제가 발생했으며 다른 컨트롤러를 푸시했습니다. Buffered Navigation Controller 와 여러 다른 접근 방식 을 사용하려고했지만 작동하지 않았습니다. 그것을 알아내는 데 약간의 시간을 보낸 후 이전 트랜잭션 (애니메이션)이 진행되는 동안 새 뷰 컨트롤러를 푸시하려고하면이 문제가 발생한다는 것을 알았습니다 (약 0.5 초 지속 시간). 어쨌든 내비게이션 컨트롤러를 위임하고 이전 애니메이션이 끝날 때까지 기다리면서 빠른 솔루션을 만들었습니다.
-viewWillAppear, -viewDidAppear, -viewDidLoad, -viewWillDisappear, -viewDidDisappear에서 해당 메서드의 오버로드에서 적절한 수퍼 메서드를 호출하는 것을 잊지 마십시오. 예를 들어 제 경우에는 다음과 같이 메서드 이름이 일치하지 않습니다.
-(void)viewDidAppear
{
[super viewDidDisappear];
//some code staff
..
}
통지 표시 하고 사라 방법은 일치하지 않는
super.viewWillAppear()
내에서 viewDidDisappear()
.
''에 대한 외모 전환 시작 / 종료를위한 불균형 통화
마지막 관련 애니메이션이 완료되기 전에 애니메이션이 시작된다고 말합니다. 그래서, 당신은 새로운 것을 밀기 전에 뷰 컨트롤러를 터 뜨리고 있습니까? 아니면 뿌리를 내릴 수 있습니까? 그렇다면 애니메이션없이 시도해보십시오.[self.navigationController popToRootViewControllerAnimated:NO];
그리고 이것이 문제를 해결하는지 확인하십시오. 제 경우에는 이것이 트릭이었습니다.
UITabbar가없고 UINavigationBar도없는 viewController에서 UIPrintInteractionController를 호출했기 때문에이 문제가 발생했습니다. UIPrintInteractionController가 올바른 printInteractionControllerParentViewController를 얻지 못한 것 같습니다. 대리자에서 메서드를 구현하고 현재 rootViewController를 반환하면 나를 위해 일했습니다.
- (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;
모달 대화 상자 되감기와 관련된 비슷한 문제가 있습니다. 여기에 솔루션 게시 ...
https://stackoverflow.com/a/38795258/324479
[문제]
Nav 컨트롤러-> VC1 -Push-> VC2 -PopOver 또는 Modal Segue-> VC3.
VC3가 VC1로 다시 풀립니다.
VC2에서 VC3 로의 Segue가 PopOver 및 Modal 인 경우 해제는 경고로 끝납니다. UIViewController의 모양 전환을 시작 / 종료하기위한 불균형 호출 "
VC에서 VC 로의 Segue가 푸시되면 경고가 사라집니다.
[해결책]
풀기 로직이 이것을 처리한다면 좋을 것입니다. 버그 일 수도 있고 아닐 수도 있습니다. 어느 쪽이든 해결책은 VC2 (팝업이있는 컨트롤러)를 되감기 대상으로 만든 다음 탐색 컨트롤러를 팝업하기 전에 표시가 완료 될 때까지 기다리는 것입니다. 이렇게하면 되감기 (역 팝업) 애니메이션이 더 뒤로 이동하기 전에 완료 할 시간이 충분합니다. 애니메이션이 꺼져 있어도 여전히 기다려야합니다. 그렇지 않으면 오류가 발생합니다.
VC2의 코드는 다음과 같아야합니다. (빠른)
class VC2: UIViewController {
private var unwind = false
@IBAction func unwindToVC1(segue:UIStoryboardSegue) {
unwind = true
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if unwind {
self.navigationController?.popViewControllerAnimated(false)
}
}
}
모달 뷰 컨트롤러가있는 뷰를 하위 뷰로 추가하는 경우 상황이 발생할 수 있습니다. 사용하기 가장 좋은 방법 :
-(void) viewDidAppear:(BOOL)animated {
[self presentViewController:self.yourModalVC animated:YES completion:nil];
}
기본적으로 표시하려는 viewController에 대해 뷰 라이프 사이클이 간소화되지 않았다는 의미입니다.
무엇의 가치를 위해, 나는에 대한 호출을 포함하지 않는이 같은 오류가있어 [super viewDidLoad:animated]
내에서 viewDidLoad
재정을.
스위프트 4
내 문제는 현재 렌더링이 완료되기 전에 다른 VC를 제시하고 있었다는 것입니다.
해결책은 빠른 지연 후 내 nextVC를 제시하는 것이 었습니다.
하지 말아야 할 일
override func viewDidLoad() {
super.viewDidLoad()
self.present(MyNextVC(), animated: true, completion: nil)
}
해야 할 일
override func viewDidLoad() {
super.viewDidLoad()
//Wait until the view finished to be constructed
perform(#selector(showMyNextVC), with: nil, afterDelay: 0.01)
}
@objc func showCityList() {
self.present(MyNextVC(), animated: true, completion: nil)
}
Break 설정을 잊었을 때이 문제가 발생했습니다. switch 문에서 뷰를 푸시 한 후!
여기처럼 :
case 1:{
SomeViewController *someViewController = [[SomeViewController alloc]initWithNibName:@"SomeViewController" bundle:Nil];
[self.navigationController pushViewController:someViewController animated:YES];
[someViewController release];
}
break; //Forgetting to set break here:
한 가지 해결책은
[NSTimer scheduledTimerWithTimeInterval:0.05(or as required) target:self
selector:@selector(your_selector_method_to_push_the_view) userInfo:nil repeats:NO];
이것은 나에게 힘든 일이었습니다. 나는 재정의했습니다.
override func shouldAutomaticallyForwardRotationMethods() -> Bool {
return true
}
재정의하지 않고 :
override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
return true
}
내 창 루트 탐색 컨트롤러에서. 그런 다음 위에서 언급 한 경고와 함께 다른 뷰 컨트롤러를 푸시 할 때 자식 탐색 컨트롤러가 불평했습니다. 경고는 최악이 아니었고 큰 문제는 자식 탐색 컨트롤러의 대리인이 더 이상 호출되지 않았다는 것입니다. 이상해.