9

iPad の技術デモを行っていますが、深刻な技術的問題に直面しています。

UISplitViewController を活用するアプリのコンセプトがありますが、アプリ全体のプライマリ コントローラーとしては使用しません。

アプリ フローは、次のように大まかに説明できます。

ホーム画面 (UIViewController) リスト -> 詳細 "カタログ" (UISplitViewController) スーパー詳細画面 (UIViewController ですが、SplitView の子でもあると考えられます)。

問題は、ホームとカタログの間の流れにあります。UISplitViewController ビューが UIWindow に追加されると、ヒストリック フィットが発生し始めます。

問題は次のように要約できます。

UISplitView がポップオーバー ビューを生成すると、親ビューにラッチされているように見えます。UIWindow サブビューから UISplitView を削除すると、CoreGraphics 例外が発生し、ビューの削除に失敗します。

他のビュー (おそらく、この場合は戻ってきたホーム画面) を追加すると、それらは自動回転しません。代わりに、CG 例外のために削除に失敗した UISplitView が代わりに回転に応答し続けます。ただ「対処」できない恐ろしいレンダリング バグを引き起こします。この時点で、ビューを追加したり、SplitView を再追加したりすると、一連のレンダリング バグが発生します。

次に、単にSplitViewを「下」ビューとして存在させたままにして、その上にホーム画面を追加および削除し続けようとしましたが、SplitViewが方向変更呼び出しを支配しているため、これは失敗し、ホーム画面は回転しません。 [homeScreen becomeFirstResponder] を呼び出した場合

SplitView を UINavigationController のような階層に配置することはできません。完全なランタイム エラーが発生するため、そのオプションは対象外です。モーダルは見栄えが悪く、とにかく落胆します。

現時点での私の推測では、この問題に対処する唯一の適切な方法は、何らかの方法で UISplitViewController を「武装解除」して、未処理の例外をスローせずに親ビューから削除できるようにすることですが、方法がわかりません。

私が必要とすることを正確に実行するアプリを見たい場合は、iPad アプリ ストアの GILT Groupe をチェックしてください。彼らはそれをやり遂げましたが、カスタムビュー遷移セット全体をプログラムしたようです.

助けていただければ幸いです。

4

6 に答える 6

8

アップルは次のように述べています

Split View Controller のビューは、常にアプリケーション ウィンドウのルート ビューとしてインストールする必要があります。ナビゲーションまたはタブ バー インターフェイス内に分割ビューを表示しないでください。

これ、別のビューのサブビューではなく、ルート ビューである必要があることを意味します。彼らは追加しますが:

ナビゲーションまたはタブ バー インターフェース内に分割ビューを表示しないでください。

これは、他のコントローラーのサブビューとして追加できるという意味ではありません。(ごめん)

あなたが経験していることは、そうしようとしたことの副産物だと感じています. GILT Groupeのアプリが拒否されなかったことに、私は実際に驚いています。Apple は最近、これらの HIG ガイドラインをかなり厳密に施行する傾向があります。それらを NavigationController に追加しようとすると (すでにわかっているように) かなり厄介な実行時エラーが発生します。

于 2010-04-15T04:19:07.607 に答える
4

私はこれを自分で解決しました...実際に回避しました...他のすべての可能なフルスクリーンビューをSplitViewのモーダルとして表示することで...

これは私の本では好ましくない方法ですが、SplitView をアプリ内で「ときどき」のみ利用したい場合、Apple はほとんど選択肢を残していません。

于 2010-04-15T21:04:12.673 に答える
4

2 番目の UIWindow を作成することで、ある程度成功しました。それに UISplitViewController を関連付けて、分割ビューを表示したいときにメイン ウィンドウに切り替えます。ローテーションのわずかな遅延と「wait_fences」に関するログメッセージを除いて、私が望んでいたように機能しているようです。

于 2010-05-03T15:26:33.243 に答える
0

私はこれらの同じ問題に遭遇し、このフォーラムトピックを見つけ、上記のg051051からのアドバイスに従ったと言いたかっただけです。これは私にとって完璧に機能しています。デバイスのコンソールにグリッチやwait_fencesに関するメッセージは表示されません。

IBを使用してメインXIBに2つのUIWindowオブジェクトを作成し、通常どおりUISplitViewControllerを作成し、UIViewControllerから派生した他のコントローラーのインスタンス(フルスクリーン表示に使用)も作成しました。各UIWindowのrootViewControllerを適切なコントローラーに接続するだけで、それらを接続しました。

application:didLaunch ...:メソッドで、makeKeyAndVisibleメソッドを送信するウィンドウと非表示に設定するウィンドウを決定できます。ユーザーが前後に切り替えたい場合は、makeKeyAndVisibleを一方に送信し、もう一方に非表示のプロパティを設定するだけです。これですべてです。

示されているように、現在表示されているウィンドウに関連付けられているメッセージに関係なく、すべての回転関連メッセージが各コントローラーに適切に送信されます。

とにかく、私にとってはうまく機能し、実際にはセットアップが非常に簡単です。

于 2011-05-06T12:59:57.650 に答える
0

ジェイルブレイクされたデバイス用に開発しない限り、リンゴのルール/願いを曲げるのは良い考えではありません。上記の Jann と Jasconius の状態と同様に、これは、splitView コントローラー ビューのルートを維持し、モーダル (漠然とした) を過度に使用せず、複数のウィンドウを使用しないことを意味します。

また、Giltアプリは米国でのみ利用可能です

私も解決策を見つけようとしていて、Tuanndが話しているようにプログラムでウィンドウからビューを削除することになりましたが、ランドスケープレンダリングのバグは許されません。

@Jasconius、いつでも提示しているモーダルの最大数は何ですか?

于 2010-07-04T12:00:15.860 に答える
0

私はこの同じ問題に苦しんでいます。UISplitViewController をブラック ボックスとしていろいろ試してみて、それがどのように反応するかを確認しました。

私は満足に機能しているように見える私のケースの解決策を思いついたようです.

重要なのは、UIWindow に追加された最初のビューが適切に初期化された唯一のビューであることです。私が経験したすべての問題は、デバイスの向きの誤った通知に起因する傾向があります。追加された最初のビューでは、これが正しく構成されているようです。

私の場合、最初のビューとして UISplitView を使用したくありませんでした。以下は私のために働いています。

アプリ デリゲートの application:didFinishLaunching メソッドは特別です。UIWindow へのビューの追加は、ここで行う必要があります。他の場所で行うと、適切に構成されません。

基本的に魔法のソースは、分割ビューをウィンドウに追加される最初のビューにすることです。UISplitViewController を保持している限り、それを削除しても問題ありません。それ以降は、UISplitView を含む他のビューを入れ替えることができ、ほとんどの場合は問題ないようです。

私はまだいくつかの問題に遭遇しました。分割ビュー以外のビューのポップオーバーは、ビュー フレームとツールバー ボタンの位置で混乱し、間違った位置に表示されます。次に、特定の場所に配置すると、そのケースが処理されるようです。

分割ビューのポップオーバーがまだ表示されている場合、別のビューを表示しようとすると、2 番目のビューの向きが混乱して横向きに表示されます。ポップアップが表示される前にそのビューにアクセスした場合、すべて問題ありません。他のビューに切り替える前に、ポップオーバーを手動で閉じることでこれを修正しました。

役立つ場合のコードは次のとおりです。すべてのコントローラーは appDelegate のインスタンス変数です

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // This also seems to work as good magic. Seems to set orientation and size properties that persist.
    [window addSubview:splitViewController.view];
    [splitViewController.view removeFromSuperview];

    [self switchToNewViewController:firstController];
    [window makeKeyAndVisible];
    return TRUE;
}

- (void)switchToNewViewController:(UIViewController *)newViewController {
    [popoverController dismissPopoverAnimated:FALSE];
    if (newViewController != currentViewController) {
        [currentViewController removeFromSuperview];
        currentViewController = newViewController;
        [window addSubView:newViewController.view];
     }
}
于 2010-09-17T19:35:28.227 に答える