0

下部にいくつかのタブがあるアプリ(UITabViewController)があり、ほとんどのタブには上部にツールバーも含まれています。

タブの1つにアクセスするには、ユーザーがログインする必要があります。これを「マイアカウント」タブと呼びましょう。ログインすると、プロフィール情報が表示されます。まだ設定していない場合は、プロフィールに入力するメリットを説明するダイアログと、大きなボタンが表示されます。 「はじめに」。これらの3つの画面はすべて、下部にタブがあり、上部にツールバーがあります。したがって、私が作成しているビューは画面の中央部分のみを占めるため、サブビューとしてロードする必要があります。基本的に、ユーザーの現在の状態に基づいて3つの異なるサブビューのいずれかを表示しようとしています。ユーザーの状態が変化するたびに(ログイン時など)、これらのサブビューを相互に切り替えることができる必要があります。

私はもともとこれらのサブビュー用に3つの別々の「レイヤー」を作成し、setHiddenを使用してそれらを切り替えましたが、使用されているビューに関係なく3つのビューすべてを初期化するという大きな欠点があります。また、非表示/非表示にしているだけのときに、トランジションをアニメーション化する方法もわかりません。

理想的には、同じビューコントローラー(親コントローラー)を共有する3つの個別のnibファイル(ビューごとに1つ)を作成し、ユーザーの状態に基づいて動的にロードすることをお勧めします。したがって、ユーザーがログインしていない場合は、「ログイン」ペン先を読み込んでから、addSubViewを使用して画面に追加します。ユーザーがログインすると、他のペン先の1つをサブビューとしてロードし、アニメーションを使用してサブビューを切り替えることができます。

私が抱えている問題は、3つのサブビューすべてが十分に単純であるため、トップレベルのビューコントローラー(「MyAccountViewController」)内でボタンクリックを処理するためのロジックを保持したいということです。たとえば、ユーザーのプロファイル情報の表示を担当する同じViewController内で「ログイン」ボタンのクリックイベントを処理できるようにしたいと思います。サブビューごとに個別のビューコントローラを作成する必要はありません。

これは私が現在行っていることです:

- (void)showLoginView {
    UIView *loginView = [[[NSBundle mainBundle] loadNibNamed:@"Login" owner:self options:nil] objectAtIndex:0];
    [self.view addSubview:loginView];
}

EXC_BAD_ADDRESSの「addSubview」行でクラッシュするだけです。ちなみに、動作しているのは、おそらく無限ループなどが原因で、メモリが不足しているようです。私はここでの解決策に道を譲っているような気がします。

私がやろうとしていることは可能ですか?

また、ログイン画面を処理するためのベストプラクティスについても知りたいと思います。私はiPhoneアプリに最適なワークフローを見つけるのに多くの問題を抱えています。私はWebアプリの作成に慣れています(もちろん、ログインが必要です。このアプリはWebサイトに関連付けられています)。

ありがとう!

編集:サブビューペン先ごとに個別のビューコントローラーを作成することを検討しました。これらのViewControllerは、それぞれのペン先内でボタンのクリックを処理し、Objective-Cのデリゲート機能を使用してイベントを親View Controllerに伝播しますが、それは可能であれば避けたい多くの余分なコードです。

4

1 に答える 1

0

まだ行っていない場合は、そのnibでの接続を再確認し、インデックス0の変数のクラスをNSLogして、UIViewであることを確認します。

私のアドバイス:ペン先をスクラップします。コードでそれを行うことができないのなら、なぜわざわざするのですか?私はペン先をレイアウトツールとしてのみ使用し、バイナリでパッケージ化することはありません。代わりにUIViewサブクラスを作成して、時間、メモリ、コード、およびストレージスペースを節約してください。

ログイン画面のアイデアのトラブルについては、行き詰まったら、モバイルデザインパターンギャラリーにアクセスしてインスピレーションを得ています。詳細をご希望の場合は...-専門家の意見をお聞かせください。SOのビジュアルいとこux.stackexchange.comにアクセスしてください。

于 2012-05-24T04:30:14.337 に答える