2013-05-03 2 views
3

방금 ​​Apple에서 iOS 6 환경으로 iOS 5 프로젝트를 옮겼습니다 (Apple에서 4 인치 장치의 컴플라이언스를 지원해야하므로). 지금은 약간의 문제가 있습니다. UIViewController을 켜면 UINavigationController이됩니다.보기 컨트롤러를 내비게이션 컨트롤러로 밀어 넣는 중 UI 블록

UIViewController 사용자 지정을 푸시 한 후 사용자 인터페이스가 처음으로 UIViewController으로 푸시 될 때만 사용자 인터페이스가 5 ~ 20 초 동안 차단됩니다. 내 UIViewController을 튕겨 다시 누르면 지연이나 UI 블록이 없습니다.

다음과 같이됩니다.

우선은있는 UITableViewController의 didSelectRowAtIndexPath에서 내 UIViewController에 밀어하고 (사용자가 초기화가 잘 작동에는 문제가) 내가 모든 것을 로그 나보다

CampaignDetailViewController *detailViewController = [[CampaignDetailViewController alloc] initWithProduct:selectedProduct]; 
    [self.navigationController pushViewController:detailViewController animated:YES]; 

은 (내가 밀어 의미 viewDidLoad, viewWillAppearviewDidAppear의 모든 코드를 삭제하지 컨트롤러는 펜촉 만 넣어야합니다.)

누름시 UIViewController;

- (id)initWithProduct:(Product *)selectedProduct 
{ 
    NSLog(@"starting init"); 
    self = [super initWithNibName:@"CampaignDetailViewController" bundle:nil]; 
    NSLog(@"nib loaded"); 
    if (self) { 
     self.navigationItem.title = selectedProduct.name; 
     self.product = selectedProduct; 
    } 
    NSLog(@"finishing init"); 
    return self; 
} 

- (void)viewDidLoad 
{ 
    NSLog(@"starting viewdidload"); 
    [super viewDidLoad]; 
    NSLog(@"finishing viewdidload"); 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    NSLog(@"view will appear"); 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    NSLog(@"view did appear"); 
} 

디버거 로그;

2013-05-03 12:33:49.678 my-app[1429:707] starting init 
2013-05-03 12:33:49.680 my-app[1429:707] nib loaded 
2013-05-03 12:33:49.683 my-app[1429:707] finishing init 
2013-05-03 12:33:49.808 my-app[1429:707] starting viewdidload 
2013-05-03 12:33:49.855 my-app[1429:707] finishing viewdidload 
2013-05-03 12:33:49.861 my-app[1429:707] view will appear 
2013-05-03 12:35:28.501 my-app[1429:707] view did appear 

은 viewWillAppear 및 viewDidAppear 사이의 지연이 30 초 이상있다.

는 내가 정기적 init를 사용하려고하고 nib 파일을 삭제 한

  • 추가 정보는 아무것도 변경되지 않습니다.
  • 아무 것도 pushViewController와 UIViewController 사이에로드되지 않습니다.
  • 이 문제는 iPhone 4 - iOS 5 장치에서 발생합니다. iOS 5 및 6 시뮬레이터에서 작동하는 모든 것이 iPhone 5에서 원활하게 작동합니다 - iOS 6 장치.
  • 내 프로젝트의 다른 부분에서도 다른보기 컨트롤러를 밀고 있지만이 UIViewController 유일한 문제인 것 같습니다.
  • 뷰 컨트롤러는 메인 쓰레드에 밀려, 따라서 제어기는,이 차단 기간 동안 메인 쓰레드
  • 에 엑스 코드 (4.6.1)로드 볼도 차단 얻고뿐만
+0

아이폰을 iOS 6 버전으로 업그레이드하거나, 프로젝트 설정에서 iOS 5 호환성을 self = [super initWithNibName : @ "CampaignDetailViewController"번들 : nil]의 'super'대신에 – Nagasaki

+0

으로 설정하십시오. 왜 'self'를 [self initWithNibName : @ "CampaignDetailViewController"bundle : nil]처럼 사용하지 않는가? –

+0

@Nagasaki 배포 대상이 iOS 5.0으로 설정되었습니다. 설정해야 할 것이 있습니까? – Bartu

답변

3
를 응답하지 않습니다

두 가지 힌트 :

1 -이 문제는 시뮬레이터 나 실제 장치에서 발생합니까? 시뮬레이터에서 많은 예상치 못한 지연이 발생했습니다.

2 - impelentations 내부

[super viewWillAppear:animated]; 

[super viewDidAppear:animated]; 

를 호출해야합니다.애플의 문서에서

:이 메소드를 오버라이드 (override)하는 경우

것은, 당신은 당신의 구현에 어떤 시점에서 슈퍼를 호출해야합니다.

+0

실제 장치에서 발생합니다. viewWillAppear 및 viewDidAppear을 추가하여 어떤 일이 일어나고 있는지 테스트합니다. 이러한 기능이 추가되기 전에 이러한 기능이 추가되지도 않았습니다.그리고 예, 수퍼가 추가되었습니다. 여전히 멈 춥니 다. – Bartu

+1

좋아, 내 의견에는 잘못된 것이 있다고 생각합니다. Alt 메소드가 빠른 속도로 돌아 오기는하지만, nib에서 뷰 컨트롤러를로드 할 때 첫 번째 뷰 호출에서만 뷰가 실제로로드됩니다 (아마도 상위 navcontroller가 addsubview를 호출 할 때). 느린 부분을 확인하려면'([super loadView]'호출 만 구현하는)'loadView' 메소드를 오버라이드하고 얼마만큼의 시간이 필요한지 확인하십시오. 멈춤 (hang)이 있다면,보기에로드를 늦추는 무언가가 있습니다 (도구를 사용 해본 적이 있습니까?) – LombaX

+0

디버깅을 위해'[super loadView]'호출을 피하고' loadView' 메소드를 호출합니다. – LombaX

0

블록 내부에서 UI 코드를 실행하는 경우 주 스레드 내부에서 실행해야합니다. UIKit은 스레드로부터 안전하지 않으므로 이런 종류의 동작에 영향을받을 수 있습니다.

__weak CurrentViewController *wSelf = self;  
dispatch_async(dispatch_get_main_queue(), ^{ 
     [wSelf.navigationController pushViewController:wSelf.someController animated:YES]; 
}); 
0

나는이 문제를 발견했다. 나는 같은 문제가 있었고, 꽤 숨겨진 버그였다. 프로젝트를 업그레이드했는데 일부 .xib 파일이 올바르게 업그레이드되지 않았습니다. 인터페이스를 빌드 할 때 .xib를 선택하고 프로젝트 배포 대상이 마지막 일 수 있도록 확인한 다음 나머지는 업데이트 된 채 아주 오래된 버전에서 멈추었습니다. 내 경우 문제에

enter image description here

0

그림자와 UILabel로했다.

관련 문제