3

iOS 5 プロジェクトを iOS 6 環境に移動したばかりです (Apple が 4 インチ デバイスの互換性をサポートすることを必須にしたためUIViewController) UINavigationController

カスタムをプッシュした後、そのカスタムを初めてUIViewControllerプッシュするときにのみ、ユーザー インターフェイスが 5 ~ 20 秒間ブロックされます。UIViewControllerポップUIViewControllerしてもう一度押すと、遅延や UI ブロックはありません。

これが何が起こるかです。

最初に、UITableViewController の didSelectRowAtIndexPath から UIViewController をプッシュしています (カスタム init は正常に動作しますが、問題はありません)。

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

私はすべてをログに記録しているよりも(私はviewDidLoad、 、viewWillAppearおよびviewDidAppearのすべてのコードをクリアしました。つまり、コントローラーを押すとペン先のみがロードされます)

押された上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 デバイスでも正常に動作します。
  • プロジェクトの他の部分にも他のView Controllerをプッシュしていますが、このUIViewControllerが唯一の問題のようです。
  • View Controller はメイン スレッドでプッシュされるため、View Controller はメイン スレッドでロードされます。
  • このブロック期間中、XCode (4.6.1) もブロックされ、同様に応答しません。
4

4 に答える 4

4

2 つのヒント:

1 - この問題はシミュレーターまたは実際のデバイスで発生していますか? シミュレーターで多くの予期しない遅延が発生しました。

2 - 電話することを忘れないでください

[super viewWillAppear:animated];

[super viewDidAppear:animated];

インペレンテーションの内側。

Apple のドキュメントから:

このメソッドをオーバーライドする場合は、実装のある時点で super を呼び出す必要があります。

于 2013-05-08T11:05:30.723 に答える
0

私の場合、問題はUILabel影にありました。

于 2016-09-24T23:15:13.933 に答える
0

ブロック内で UI コードを実行する場合は注意してください。これはメイン スレッド内で実行する必要があります。そうしないと、UIKit はスレッドセーフではないため、この種の動作の影響を受けるか、さらに悪化する可能性があります。

__weak CurrentViewController *wSelf = self;    
dispatch_async(dispatch_get_main_queue(), ^{
        [wSelf.navigationController pushViewController:wSelf.someController animated:YES];
});
于 2014-06-17T23:03:16.417 に答える