Closed6

【Swift】UITabBarController (View Controllers)0->1

yoshitakayoshitaka

UITabBarController(UIKit -> View Controllers -> )

複数選択インターフェイスを管理するコンテナビューコントローラ。選択によって、表示する子ビューコントローラが決まります。

class UITabBarController : UIViewController

タブバーインターフェイスでは、ウィンドウの下部にタブが表示され、さまざまなモードを選択したり、そのモードのビューを表示したりできます。このクラスは通常、そのまま使用されますが、サブクラス化される場合もあります。

タブバーコントローラーインターフェイスの各タブは、カスタムビューコントローラーに関連付けられています。ユーザーが特定のタブを選択すると、タブバーコントローラーは対応するビューコントローラーのルートビューを表示し、以前のビューを置き換えます。 (ユーザーがタップすると、以前に選択したタブに関係なく、常にタブのルートビューが表示されます。これは、タブが既に選択されている場合でも当てはまります。)タブを選択すると、インターフェイスのコンテンツが置き換えられるため、それぞれで管理されるインターフェイスのタイプタブは決して類似している必要はありません。実際、タブバーインターフェイスは、さまざまな種類の情報を表示するため、またはまったく異なるスタイルのインターフェイスを使用して同じ情報を表示するために一般的に使用されます。図1は、Clockアプリによって表示されるタブバーインターフェイスを示しています。各タブには、時間ベースの情報のタイプが表示されます。

タブバーコントローラーのタブバービューに直接アクセスしないでください。タブバーコントローラーのタブを構成するには、各タブのルートビューを提供するビューコントローラーをviewControllersプロパティに割り当てます。ビューコントローラを指定する順序によって、タブバーに表示される順序が決まります。このプロパティを設定するときは、selectedViewControllerプロパティにも値を割り当てて、最初に選択されたビューコントローラを示す必要があります。 (selectedIndexプロパティを使用して配列インデックスでビューコントローラーを選択することもできます。)タブバーコントローラーのビュー(継承されたビュープロパティを使用して取得)をアプリウィンドウに埋め込むと、タブバーコントローラーは自動的にそのビューコントローラーを選択し、その内容を表示します、タブバーのインターフェイスに合わせて必要に応じてサイズを変更します。

タブバーの項目は、対応するViewControllerを介して構成されます。タブバーアイテムをビューコントローラに関連付けるには、UITabBarItemクラスの新しいインスタンスを作成し、それをビューコントローラ用に適切に構成して、ビューコントローラのtabBarItemプロパティに割り当てます。 View Controllerにカスタムタブバーアイテムを指定しない場合、View Controllerは、ViewControllerのtitleプロパティからの画像とテキストを含まないデフォルトのアイテムを作成します。

ユーザーがタブバーインターフェイスを操作すると、タブバーコントローラーオブジェクトは操作に関する通知をデリゲートに送信します。デリゲートは、指定する任意のオブジェクトにすることができますが、UITabBarControllerDelegateプロトコルに準拠する必要があります。デリゲートを使用して、特定のタブバー項目が選択されないようにしたり、タブが選択されたときに追加のタスクを実行したりできます。デリゲートを使用して、Moreナビゲーションコントローラーによって行われたタブバーへの変更を監視することもできます。これについては、More NavigationControllerで詳しく説明しています。

yoshitakayoshitaka

タブバーコントローラーのビュー

UITabBarControllerクラスはUIViewControllerクラスを継承するため、タブバーコントローラーには、viewプロパティからアクセスできる独自のビューがあります。 タブバーコントローラーのビューは、タブバービューとカスタムコンテンツを含むビューの単なるコンテナーです。 タブバービューは、ユーザーに選択コントロールを提供し、1つ以上のタブバーアイテムで構成されます。 図2は、これらのビューを組み立てて、タブバーインターフェイス全体を表示する方法を示しています。 タブバーとツールバービューの項目は変更できますが、それらを管理するビューは変更できません。 現在選択されているタブのビューコントローラを反映するように、カスタムコンテンツビューのみが変更されます。

タブのルートビューコントローラーとして、ナビゲーションコントローラーまたはカスタムビューコントローラーを使用できます。 ルートビューコントローラーがナビゲーションコントローラーの場合、タブバーコントローラーは、表示されるナビゲーションコンテンツのサイズをさらに調整して、タブバーと重ならないようにします。 したがって、タブバーインターフェイスに表示するビューには、autoresizingMaskプロパティを設定して、どのような条件下でもビューのサイズを適切に変更する必要があります。

その他のナビゲーションコントローラー

タブバーには、カスタムアイテムを表示するための限られたスペースがあります。 タブバーコントローラーに6つ以上のカスタムビューコントローラーを追加すると、タブバーコントローラーは最初の4つのアイテムと標準の[その他]アイテムのみをタブバーに表示します。 [その他]アイテムをタップすると、残りのアイテムを選択するための標準インターフェイスが表示されます。

標準の[その他]アイテムのインターフェイスには、ユーザーがタブバーを再構成できる[編集]ボタンが含まれています。 デフォルトでは、ユーザーはタブバーのすべてのアイテムを再配置できます。 ただし、ユーザーに一部の項目を変更させたくない場合は、customizableViewControllersプロパティの配列から適切なViewControllerを削除できます。

yoshitakayoshitaka

状態の保存

iOS 6以降では、このView ControllerのrestorementIdentifierプロパティに値を割り当てると、選択したタブでViewControllerへの参照が保持されます。復元時に、参照を使用して同じViewControllerのタブを選択します。

タブバーコントローラーを保持する場合は、保持する子ビューコントローラーに一意の復元識別子を割り当てます。子ViewControllerから復元IDを省略すると、そのタブはデフォルト構成に戻ります。タブバーコントローラーは、viewControllersプロパティにリストされているのと同じ順序でタブを保存しますが、実際には保存順序は関係ありません。コードは、次の起動サイクル中に新しいタブバーコントローラーを提供する責任があるため、コードは必要に応じてタブの順序を調整できます。状態保存システムは、タブの位置ではなく、割り当てられた復元識別子に基づいて各タブの内容を復元します。

状態の保存と復元の仕組みの詳細については、iOS用アプリプログラミングガイドを参照してください。

yoshitakayoshitaka

タブバーコントローラーのタブバービューに直接アクセスしないでください。タブバーコントローラーのタブを構成するには、各タブのルートビューを提供するビューコントローラーをviewControllersプロパティに割り当てます。ビューコントローラを指定する順序によって、タブバーに表示される順序が決まります。このプロパティを設定するときは、selectedViewControllerプロパティにも値を割り当てて、最初に選択されたビューコントローラを示す必要があります。

ルートビューコントローラーがナビゲーションコントローラーの場合、タブバーコントローラーは、表示されるナビゲーションコンテンツのサイズをさらに調整して、タブバーと重ならないようにします。

yoshitakayoshitaka

色々調べたけど、UITabbarContorllerが先でその後にUINavigationControllerが来るとNavigationBarが操作できないようだ。

ドキュメントでもイメージ図はtabbarの次にnavigationbarが来ているのも関係があるのかな。

それとNavigationControllerを使ってTabbarControllerへ画面遷移させないといけないかも?

yoshitakayoshitaka

ViewControllerの管理

var viewControllers: [UIViewController]?
An array of the root view controllers displayed by the tab bar interface.
// タブバーインターフェイスによって表示されるルートビューコントローラの配列。
func setViewControllers([UIViewController]?, animated: Bool)
Sets the root view controllers of the tab bar controller.
// タブバーコントローラーのルートビューコントローラーを設定します。
var customizableViewControllers: [UIViewController]?
The subset of view controllers managed by this tab bar controller that can be customized.
// カスタマイズ可能なこのタブバーコントローラーによって管理されるビューコントローラーのサブセット。
var moreNavigationController: UINavigationController
The view controller that manages the More navigation interface.
// Moreナビゲーションインターフェイスを管理するViewController。

選択したタブの管理

var selectedViewController: UIViewController?
The view controller associated with the currently selected tab item.
// 現在選択されているタブ項目に関連付けられているビューコントローラ。
var selectedIndex: Int
The index of the view controller associated with the currently selected tab item.
// 現在選択されているタブ項目に関連付けられているViewControllerのインデックス。
このスクラップは2021/05/16にクローズされました