2013-05-03 199 views
3

我剛剛搬進了我的iOS 5的項目到iOS 6的環境(因爲蘋果做出強制要求支持4英寸設備保持兼容),現在我有一個位,而有問題的將UIViewController推至UINavigationControllerUI塊,而在推視圖控制器導航控制器

當我按自定義UIViewController後,我的用戶界面阻止了5到20秒,只有當我第一次推送定製UIViewController時。如果我彈出我的UIViewController並再次推送,則沒有延遲或UI塊。

這裏是什麼情況;

首先我從UITableViewController中的didSelectRowAtIndexPath方法推我的UIViewController(自定義的初始化工作正常,沒有任何問題上都存在)

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

比我記錄一切(我清除了所有的代碼在viewDidLoadviewWillAppearviewDidAppear,這意味着推控制器只應加載筆尖)

在推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和取出筆尖文件,什麼都沒有改變。
  • 沒有被加載在pushViewController和加載的UIViewController之間。
  • 此問題發生在我的iPhone 4 - iOS 5設備上。一切工作正常iOS 5和6模擬器也適用於我的iPhone 5 - iOS 6設備。
  • 我對我的項目的其他部分推其他視圖控制器爲好,但這個UIViewController中似乎是唯一的問題。
  • 視圖控制器被推主線程上,因此視圖控制器被加載在主線程
  • 上在此阻塞期間,的XCode(4.6.1)也被阻斷並且不作出響應,以及
+0

將您的iphone升級到ios 6版本,或者在您的項目設置中設置ios 5兼容性 – Nagasaki 2013-05-03 09:50:15

+0

,而不是self中的'super'= [super initWithNibName:@「CampaignDetailViewController」bundle:nil];爲什麼不使用'self'就像[self initWithNibName:@「CampaignDetailViewController」bundle:nil]; – 2013-05-03 09:50:32

+0

@Nagasaki部署目標設置爲iOS 5.0。還有什麼要設置的嗎? – Bartu 2013-05-03 09:53:14

回答

3

兩個提示:

1 - 這是問題發生在模擬器或真實設備上?我在模擬器上遇到過很多意想不到的延遲。

2 - 記得打電話

[super viewWillAppear:animated]; 

[super viewDidAppear:animated]; 

的impelentations內。

從蘋果文檔:

如果重寫此方法,您必須在您執行某些時候調用超。

+0

它發生在真實設備上,並且我添加了viewWillAppear和viewDidAppear以測試發生了什麼,當它開始發生時,甚至沒有添加這些函數。是的,超級也被添加,它仍然掛起 – Bartu 2013-05-08 14:35:34

+1

好吧,我認爲你的觀點有問題。儘管init方法返回的速度很快,但從nib加載視圖控制器時,其視圖實際上只在第一次視圖調用時加載(可能是上部navcontroller調用addsubview時)。爲了確保緩慢的部分是這樣的,請重寫'loadView'方法(僅實現'[super loadView]'調用)並查看需要執行多少時間。如果掛在那裏,視圖上有東西會減慢負載(你有沒有使用儀器?) – LombaX 2013-05-08 15:02:55

+0

爲了調試的目的,你甚至可以避免調用'[super loadView]'並在''手動創建一個空視圖' loadView'方法。 – LombaX 2013-05-08 15:06:22

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陰影。

相關問題