1

私の最近のプロジェクトでは、presentviewController を使用してビューの切り替えを整理しました。しかし、奇妙な問題があります。

最初に、git ハブでデモを作成しました: test present view。問題が理解しやすくなることを願っています。

次に、デモで行ったことを示します。1) ルート ビュー コントローラーは T1RootViewController で、次のプロパティがあります。

@property (strong, nonatomic) T1TopViewController1 *top1VC;
読み込まれると、T1TopViewController1 が唯一のサブビューとして追加されます。
self.top1VC = [[T1TopViewController1 alloc] initWithNibName:@"T1TopView1" bundle:nil];
[self.view addSubview:self.top1VC.view]; 

2) T1TopViewController1 には次のプロパティがあります。

@property (strong, nonatomic) T1TopViewController2 *topVC2;
また、押されたときに T1TopViewController2 を表示するボタンもあります。
self.topVC2 = [[T1TopViewController2 alloc] initWithNibName:@"T1TopView2" bundle:nil];
[self presentViewController:self.topVC2 animated:NO completion:nil];

3) T1TopViewController2 は T1TopViewController1 とほぼ同じですが、T1TopViewController3 が存在する点が異なります。

4) T1TopViewController3 にはボタンがあり、押すと T1TopViewController1 に戻ります。

UIWindow *rootWin = [[UIApplication sharedApplication] keyWindow];
T1RootViewController *rootVC = (T1RootViewController *)rootWin.rootViewController;
[rootVC.top1VC dismissViewControllerAnimated:NO completion:nil];

次に、T1TopViewController1 からこのアプリを実行し、T1TopViewController3 が表示されるまで各ビューのボタンをクリックします。T1TopViewController3 ボタンをクリックすると、T1TopViewController1 に戻ります。次に、T1TopViewController1 のボタンをもう一度クリックします。問題が発生する可能性があります:
1) ios 5 シミュレーターでは問題ありません
2) ios 6.1 シミュレーターまたはデバイスではクラッシュし、次のログが記録されます:
test[699:c07] * -[T1TopViewController2 isKindOfClass:]: message sent割り当て解除されたインスタンス 0x75ade30 へ

コードのどこが間違っているのか、それを修正する方法が本当にわかりません。どんな助けにもとても感謝します。

ps 開発環境はmac os x 10.8.4、xcode 4.6.3です。プロジェクトは ARC を有効にします。

4

2 に答える 2

0

コードが機能しない理由がわかりません。しかし、テスト プロジェクトでやりたいことを実現する方法を見つけました。でボタンのアクションを入れ替えるT1TopViewController3

- (IBAction)backBtn_onTouchUpInside:(id)sender
{
    UIViewController *presentingViewController = self.presentingViewController;
    [self dismissViewControllerAnimated:NO completion:^{
        [presentingViewController dismissViewControllerAnimated:NO completion:nil];
    }];
}

それはうまくいくはずです。

于 2013-07-04T09:07:22.420 に答える
0

私はあなたのアプリを実行しましたが、そこで奇妙なことがわかりました。UIViewController を RootViewController として持っていて、別の UIViewController を初期化し、彼の UIView を RootViewController のビューに追加します。

とにかく、ここに私がやったことがあります:

コードを AppDelegate から次のように変更できます。

 T1TopViewController1 *cont = [[T1TopViewController1 alloc] initWithNibName:@"T1TopView1" bundle:nil];
 self.window.rootViewController = cont;

あなたが持っていたものの代わりに。

そして機能:

- (IBAction)backBtn_onTouchUpInside:(id)sender
{
 UIWindow *rootWin = [[UIApplication sharedApplication] keyWindow];
[rootWin.rootViewController dismissViewControllerAnimated:NO completion:nil];
}

T1TopViewController3 から

これで、コントローラーを好きなだけ変更できます。

于 2013-07-04T10:43:38.817 に答える