iPad/Xcode4:MGSplitViewControllerの使い方をしらべる。

■あらすじ:
これの続き。
iPad/Xcode4:SplitViewのRootとDetailのサイズを変更したい
http://d.hatena.ne.jp/cn_t/20120122/1327225418


MGSplitViewController(http://mattgemmell.com/2010/07/31/mgsplitviewcontroller-for-ipad/)の使い方を説明してる日本語ページがなかったので調べてみる。

■ちゅうい:
MGSplitViewControllerのサンプル勉強しないまま強行して使ってます。
なのでボロでまくりで多分非効率的なことになってます注意(´・ω・`)


■やったこと:
お決まりの時系列で。

1)プロジェクト作成
今回は、Xcode4, Storyboardなし,TabBarテンプレートで作成

2)MGSplitViewControllerのライブラリをインポート。
以下のファイルをプロジェクトにインポート。
MGSplitViewContoller.h/m
MGSplitDividerView.m/h
MGSplitViewCornersView.h/m

3)ライブラリを使う。
よくわかんなくていろいろ調べた結果以下のページを参考にしてみた。
(中国語サイト)
http://tangqiaoboy.blog.163.com/blog/static/1161142582011101185920611/

(1)AppDelegate.mにMGSplitViewContoller.h、Root側のViewController,Detail側のViewControllerをインポート。
(2)- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsにSplitViewを作成、タブに追加

MGSplitViewController *splitViewController = [[[MGSplitViewController alloc] init] autorelease];
splitViewController.title = @"タブのタイトル";
splitViewController.masterViewController = [[[RootViewController alloc] init] autorelease];
splitViewController.detailViewController = [[[DetailViewController alloc] init] autorelease];

// ここにタブ追加する処理の記述

で、とりあえず表示まで可能。
あとでまた追記するかも

■その後やったこと
1)コンパイルしたら警告がでてた。
MGSplitViewController.m

  • >メソッドの戻り値が UIVIewControllerであるのにNSObject型だったため。
  • >(UIViewController*)で型変換してかえしてみた。

MGSplitCornersView.m

  • >C形式でかいた関数に対してでてたらしい。
  • >Objective-C形式にかえてみた


2)実行時にデバック上で警告?ログがでてた
実際のログ
-[UIPopoverController presentPopoverFromRect:inView:permittedArrowDirections:animated:]: the rect passed in to this method must have non-zero width and height. This will be an exception in a future release.

内容は[UIPopoverController presentPopoverFromRect:inView:permittedArrowDirections:animated:]のpresentPopoverFromRect:で幅と高さが非0じゃないと将来的に例外になるよ〜的な感じ?
(英語ワカランのでわかるかた指摘よろすくです・・・)

MGSplitViewController.mの- (void)reconfigureForMasterInPopover:(BOOL)inPopover内580行付近
[_hiddenPopoverController presentPopoverFromRect:CGRectZero inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO];
この行のCGRectZeroをやめて、
CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height)
この値を渡してみた。
いまのところ問題はない。妥当値かはあとでしらべる。

3)mainWindowがないプロジェクトに移植するんだが。
MGSplitViewControllerサンプルのDetailViewController.xidでmainWindowにあるSplitViewに対してIBOutletしてるっぽい?

  • >mainWindowがない場合はどうする???
  • >DetailViewController.mのconfigureViewにデリゲートから無理矢理取得したらそれっぽく動いた!

.hでIBOutletをやめて、
.mのconfigureViewで、
 splitController = (MGSplitViewController*)[ [del tabBarController] selectedViewController];
で取得。(tabBarから選択中の画面ViewController(=SplitViewController)を取得)

ちなみにAppDelegate.mの
[detailViewController performSelector:@selector(configureView) withObject:nil afterDelay:0];
をコメントにしておかないと落ちる。

4)なんとRootViewControllerのxidはmainWindow.xidだった。(そこからIBOutletがきてる)
で、そこで右側ViewControllerを取得していたのでソースでかきかえ。
デリゲートにアクセス->タブバーからSplitViewController取得->detailViewの取得。な感じで。
ソースはまたあとで。

SplitViewController内にもIBOutletがいた。びっくり。


5)rootでdetailの変数かきかえると更新用のメソッドがはしる仕組みとは?

  • >ここが移植時うまく動作せず。。。ぬぬぬ。
  • >root,detailのdelegate,ViewController設定が上手く行ってなかった。viewDidLoadに書いちゃだめだった。

※configureView呼ばなくなったのでviewDidLoadにかいてた。

6)5の逆(detailからroot通知)はどうつくる?
7)左(root)オンリーの表示ってできないかね?


■ところで:
MGSplitViewが使われて、販売されてるアプリってなにがあるんだろうか?