だいたい47度

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PageTop

UITabBarControllerのハマリどころとシステムアイコン

UITabControllerはiOSのタブ機能を実装してくれているコンポーネントです。その子クラスを作った際に迷ったところをメモ。※ARC対応コードです。

基本的な使い方
UITabBarControllerの子クラス"MyTabBarController"を作ってみました。

MyTabBarControllerのタブごとに描画するUIViewControllerは別に作る必要があります。以下では"MyViewController"という独自ViewControllerを3つ、タブとして使っています。

MyViewControllerは引数を受けて別々の描画を行います。以下では引数をNSString *としています。それぞれの引数は、MyTabBarControllerのプロパティにNSArrayとして受けます。

つまり、MyTabBarControllerのインスタンスを生成した後、tabItemsプロパティに描画したいタブの数だけパラメータを渡せば、うまいことMyViewControllerをタブとして描画してくれるようになっています。

// MyTabBarController.h
#import <UIKit/UIKit.h>
@interface MyTabBarController : UITabBarController
@property (nonatomic, strong) NSArray * tabItems;
@end

// MyTabBarController.m
#import "MyTabBarController.h"
@implementation MyTabBarController : UITabBarController

- (void)viewWillAppear:(BOOL)animated
  // MyViewControllerのArray
  NSMutableArray *controllerArray = [NSMutableArray arrayWithCapacity:[tabItems count]];

  for (int i = 0; i < [tabItems count]; i++) {
    NSString *param = [self.tabItems objectAtIndex:i];

    // パラメータを使ってinitします。普通にinitしてからpropertyに渡しても可
    MyViewController *controller = [[MyViewController alloc] initWithParam:param];
    [controllerArray addObject:controller];
  }

  [self setViewControllers:controllerArray];

  [super viewWillAppear:animated];
}
@end

// 使い方例
MyTabBarController * myTabBarController;
myTabBarController = [[MyTabBarController alloc] init];
myTabBarController.tabItems = @[ @"hoge", @"fuga", @"hogefuga"];


ここでハマったのが、「カスタムのUITabBarControllerではviewDidLoadが想定しない時点で呼び出される」という点でした。上記でviewWillAppear:内に書いてある処理は、最初はviewDidLoad内に書いていたのですが、何度やっても描画がうまくいきません。

調べていく内に、どうもUITabBarControllerのinitメソッドにおいてviewDidLoadが呼び出されているようでした。そのため、呼び出し側の[[MyTabBarController alloc] init];時点でviewDidLoadが実行され、その後でpropertyに値を渡す形になってしまっていたのです。

非常に気持ち悪いのですが、viewWillAppear:に書くことで対応しました。

システムアイコン一覧
UITabBarControllerのタブに描画するアイコンは幾つか用意されています。12のenumの数だけあるようですが、画像一覧が見つからなかったので貼っておきます。

systemicons.png
UITabBarSystemItemMore, UITabBarSystemItemFavorites, UITabBarSystemItemFeatured, UITabBarSystemItemTopRated
UITabBarSystemItemRecents, UITabBarSystemItemContacts, UITabBarSystemItemHistory, UITabBarSystemItemBookmarks
UITabBarSystemItemSearch, UITabBarSystemItemDownloads, UITabBarSystemItemMostRecent, UITabBarSystemItemMostViewed
関連記事
スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する
 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。