2

タブバーコントローラー内に、まったく新しい非ストーリーボード(プレーンな古いペン先)スタイルのナビゲーションコントローラーを追加しようとしています。

XCodeに「タブバーアプリケーション」と呼ばれる新しいプロジェクトテンプレートがあることを前提としたこのデモを見つけました。そうではありません。現在、XCode4.6には「新しいタブ付きアプリケーション」があります。もちろん、Appleは彼らの偉大な知恵で、メインウィンドウのペン先(.xib)を使用せず、タブバーコントローラーとそのページを、新しいユーザーフレンドリーなNIBではなくアプリデリゲートでコード化する必要があると判断しました。インスタンス化されたタブコントローラ。これは、その方が柔軟性が高く、ユーザーに表示されるタブと表示されないタブを決定するコードを記述できるためだと思います。ストーリーボードをオンにすると、視覚的にすべてを実行できると思います。

私は、XCodeのバージョンの違いの長く苦しんでいる歴史に深く混乱しています。これは、さまざまなiOSバージョンとさまざまなXCodeバージョンを参照し、XCodeのバージョンに固有の仮定を行う、Web上のスタックオーバーフローとデモに関する既存の質問の有効性に影響を与えます。とiOSは現在変更されているように見え、それぞれMain Nib File Base Nameが設定されているかどうかの内容に関して異なる選択に依存しています。

また、ストーリーボードの作成の背後にある主な動機は、ストーリーボード前のペン先と、さまざまなUIKitウィジェットとコントローラーを組み合わせる複雑さであるように思われます。

私は、このアップルの心の変化の前に作成されたように見える実際の非ストーリーボードのペン先ベースのアプリケーションで作業しています。起動時に、多くの不要なビューがペン先のインスタンス化によって自動的に作成されてから削除されることがわかります。タブバーコントローラのタブを動的に非表示および表示するため。これはAppleで多くのことを考えられていたようで、XCodeでの新しいアプリケーションの生成方法を変更することで、推奨される方法を暗黙的に変更しました。私は彼らの知恵に疑問を抱いていません。実際、私はその変化に感謝していますが、それは私を失い、混乱させました。

とにかく、私はメインタブバーのタブ内にナビゲーションコントローラーを配置しようとしています。XCodeがメインウィンドウを生成し、「タブバーアプリケーション」を生成するために使用したときに起動されているはずのアプリケーションがすでにあります。タブ付きビューであるトップレベルビューであり、タブバーコントローラーがペン先でインスタンス化されます。上記のデモは同じことを前提としています。

Appleは、タブバーとナビゲーションコントローラのこの明らかな組み合わせのデモを提供したことがないことで有名です。またはそう言われています。そして、Apple Human InterfaceGuidelinesは明らかにナビゲーションコントローラーをタブバーの中に置く方が良いと述べています(またはその逆よりも良いです)、そして私の質問は可能な限りHIGに準拠したいと思っていると理解されるべきです、それで私は信じます推奨されている組み合わせではなく、推奨される組み合わせについて質問しています。

これが私がこれまでに試したことです:

  1. 2009年頃から、このブログ投稿をフォローしようとしました。これは、もはや真実ではない古いバージョンのXCodeについて真実であると想定しています。

  2. XCodeが生成した新しいタブ付きアプリケーションから始めて、ストーリーボードをオフにして、アプリの起動時に明らかに作成されるルートアプリデリゲート.mファイル、完全にコード内のタブバーコントローラーオブジェクト、およびメインウィンドウのペン先はありません。次のコードは完全にAppleによって書かれています。タブのいずれかをナビゲーションバーに変更したい場合、(比較的新しいCocoa開発者として)どこに侵入して新しいものを配置するのか疑問に思っています。およびそれに関連するUINavigationViewController:

-このマーカーは、stackoverflowの破壊されたマークダウンシステムが混乱しないようにするのに役立ちます-

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    UIViewController *viewController1, *viewController2;
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        viewController1 = [[RPDAFirstViewController alloc] initWithNibName:@"RPDAFirstViewController_iPhone" bundle:nil];
        viewController2 = [[RPDASecondViewController alloc] initWithNibName:@"RPDASecondViewController_iPhone" bundle:nil];
    } else {
        viewController1 = [[RPDAFirstViewController alloc] initWithNibName:@"RPDAFirstViewController_iPad" bundle:nil];
        viewController2 = [[RPDASecondViewController alloc] initWithNibName:@"RPDASecondViewController_iPad" bundle:nil];
    }
    self.tabBarController = [[UITabBarController alloc] init];
    self.tabBarController.viewControllers = @[viewController1, viewController2];
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

コードを書かなくても可能だったことが(私がリンクしたブログの2009年の例によると)、今では純粋にコードで行われているようです。私は約500ページの「ProgrammingiOS5」を読み、最初のアプリで数百時間作業し、多くのデモアプリケーションを試しましたが、まだ比較的経験の浅いCocoa / iOS開発者であり、私の一部だと思います。これらすべての混乱は「コントローラーとビュー」のパターンであり、コードとペン先の両方でそれらを組み合わせるためのルールは、私には完全には明確ではありません。

-

更新:あなたはcodezを持つことができます!私のような将来のXCode-cocoa-iOS初心者を支援するために、完全なデモアプリを作成し、ここのgithubに投稿しました。

スクリーンショット: ここに画像の説明を入力してください

4

4 に答える 4

4

私も同じことをしたときと同じように戸惑いましたが、構造を理解すれば非常に単純であることがわかります。

基本的に、最初に表示したい RootViewController を使用して UINavigationController を作成します。

[UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:theViewControllerYouWantToDisplayFirst];

次に、このコントローラーをタブ ボタンの配列に追加するだけです。

NSArray *tabs = [[NSArray alloc] 
                        initWithObjects: navController, otherTab, etc];

次に、そのような配列を使用してタブを設定します。

UITabBarController *rootController = [[UITabBarController alloc] init];
[rootController setViewControllers:tabs];

ウィンドウのタブコントローラーに追加します。

[self.window setRootViewController:rootController];

それだけです。物事がどのように構造化されているかを理解するのに少し時間がかかりました。Tab View Controller は一連の ViewController を保持するだけで、それらの View Controller の 1 つを NavigationController にする必要があります。

于 2013-02-22T15:31:26.937 に答える
1

タブ付きアプリケーションの 1 つの「足」の下に配置したい作業アプリケーションがありました。他のタブの下にある「より大きなアプリ」の他の部分を開発したかったのです。ストーリーボードは使いたくありませんでした。これにより、私が見つけた多くのソリューションが削除されました。残りのソリューションのほとんどは、古いバージョンの Xcode を使用して開発されたものであり、2013 年 2 月にダウンロードしたバージョンの Xcode では機能しません。

このスレッドの一部の開発者が使用していたように、独自のタブ付きアプリケーションを作成してみました (「空のアプリケーション」から始めます)。近づいているように感じましたが、うまく機能させることができませんでした。

Vishal Kurup による "Tabbed Application with a Navigation Controller" の使用に関する優れたチュートリアルがあります。

ビデオに従って小さな変更 (以下にリスト) を行うことで、既存のアプリケーションを Xcode によって作成されたデフォルトの「タブ付きアプリケーション」の下に入れることができました。

Xcode 4.3 でナビゲーション コントローラー + 詳細ビューを使用して TabBar コントローラーを作成する

で見つけることができます

http://www.youtube.com/watch?v=UMpNbCs4mr4

デフォルトの「タブ付きアプリケーション」から変更しなければならなかった唯一の実際の変更は、AppDelegate.m にありました。

「タブ付きアプリケーション」を選択することによって提供される次のコードは、私の目的を果たしません

    self.tabBarController.viewControllers = @[viewController1, viewController2];

これはした

 self.tabBarController.viewControllers = [NSArray arrayWithObjects:navigation ,
     viewController1 ,viewController2, viewController3, viewController4,  nil];

Vishal Kurup氏に心から感謝します。彼は、iOS 開発に関する質の高いビデオを数多く作成しています。

于 2013-05-06T15:00:06.870 に答える
1

最初の 2 つの回答 (どちらも正しい) で説明したように、元の "Tabbed Application" テンプレート (おそらく XCode のバージョン 3? 覚えていません) に戻る別の方法を追加します。このテンプレートには、内部に TabBarController を含むメインの xib ファイルがあります。

空のアプリケーション テンプレートから始めて、次の手順を実行する必要があります。

  • 新しいファイル、ユーザー インターフェイス、アプリケーション Xib を追加します。このチュートリアルでは、「Application.xib」という名前を付けることを前提としています。
  • AppDelegate.h ファイルに移動し、次の行を変更します。

    @property (強力、非アトミック) UIWindow *window;

IBOutlet の追加:

@property (strong, nonatomic) IBOutlet UIWindow *window;
  • AppDelegate.m 内に移動し、これで applicationDidFinishLaunching メソッドを変更します

:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // delete all and leave only the return
    return YES;
}
  • Application.xib 内に移動し、[オブジェクト] メニューから [App Delegate] を選択し、ID インスペクターでクラスを変更します --> AppDelegate (または AppDelegate.h クラス名) を記述します。
  • 常に Application.xib で App Delegate Object をもう一度右クリックすると、「ウィンドウ」アウトレットが表示されます --> 左側のオブジェクト インスペクタでウィンドウ オブジェクトにリンクします
  • ここで、プロジェクトに戻り、サポート ファイル main.m に移動し、次のように戻り行を変更します。

:

return UIApplicationMain(argc, argv, nil, nil);
  • 次に、メインの .plist ファイル内に移動し、キーを追加します。右クリックして追加、キー、「メイン Nib ファイルのベース名」、タイプ文字列、値「アプリケーション」 (引用符なし、.xib 拡張子なし)

OK、これで空の「古いスタイル」の nib アプリケーションができました。Application.xib 内に再び移動し、TabBar をドラッグして、ウィンドウの「ルート ビュー コントローラー」としてリンクします (ウィンドウを右クリックし、ルート ビュー コントローラー プロパティをリンクします)。次に、タブ バー内で、ViewControllers、Navigation Controllers などをドラッグできます。

他の詳細や画像が必要な場合は、私に書いてください

編集:

見たい場合は、サンプル プロジェクトをアップロードしました: http://www.lombax.it/documents/ManualTab.zip

スクリーンショット: ここに画像の説明を入力

于 2013-02-22T16:02:33.437 に答える
1

基本を習得するために新しいアプリを開始してもかまわない場合は、次のことを試してください。

タブ付きアプリケーションを作成します (または、最近では何と呼ばれていても):

次に、NavigationController に埋め込むビューを選択します。

次に、以下に示すように、NavigationController で Editor -> Embed -> に移動します。

ここに画像の説明を入力

結果は次のようになります。

ここに画像の説明を入力

乾杯!

于 2013-02-22T15:26:19.470 に答える