iOS:BOOLをNSLogに出力する

今までこんな感じでやってた。
BOOL a;
NSLog(@"a = %d", a);

YES時は 1、NOの時は 0。

でもYES/NO文字ででてくれた方がぱっと見でわかりやすいよな〜〜と思っていたらCの人がおせーてくれた。


NSLog(@"%@", a ? @"YES" : @"NO");


なんと!Cの判定文を活用するとこんなにわかりやすくなった!!

iOS:クラスを調べる

■目的:
self.view.subviewsの中身チェックしたいときとか、アラートをいじりたいときとか。中に含まれてるコンポーネントのクラスを調べる。

■コード:

if([hoge isKindOfClass:[UILabel class] ]){
NSLog(@"UILabel");

}else if([hoge isKindOfClass:[UIImageView class] ]){
NSLog(@"UIImageView");

}else if([hoge isKindOfClass:[UIView class] ]){
NSLog(@"UIView");
}

含まれてるクラス、なので、UIViewなんかはいろんなコンポーネントが継承してるので下にかかないと悲惨なことになる。

なんだかこれ、たまーに使うんだけどイマイチ記憶に残りにくい。

かなり脱線するんだけどコード書くときなにで囲めばいいんだこれ?

iOS5/Xcode4:実機での実行時にwarningが発生する(未解決)

■現象:UITextFieldをクリックし、フォーカスをあてた際にデバッグに以下の警告が表示される。

warning: Unable to read symbols for /Users/なまえ/Library/Developer/Xcode/iOS DeviceSupport/5.0.1 (9A405)/Symbols/System/Library/TextInput/Riven.bundle/Riven (file not found).
warning: No copy of Riven.bundle/Riven found locally, reading from memory on remote device. This may slow down the debug session.


調べるとファイルは違うが同じ現象がおこっているらしい。
http://iphone-app-developer.seesaa.net/article/240689292.html

iOS4系統時代にもあったらしい
http://pocket-man.blogspot.com/2011/04/xcode-warning-unable-to-read-symbols.html

で、上記サイトを参考にしてターミナルから以下のコマンド実行。

sudo ln -s /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/TextInput /Users/なまえ/Library/Developer/Xcode/iOS\ DeviceSupport/5.0.1\ \(9A405\)/Symbols/System/Library

すると、

ln: /Users/なまえ/Library/Developer/Xcode/iOS DeviceSupport/5.0.1 (9A405)/Symbols/System/Library/TextInput: File exists

もうファイルあるんだよばーかばーかとの返事が。
ならばとそのファイルをどかして(リネームした)実行する。もちろんこれはエラー文句ない。
ではではとアプリを実行して、フォーカスインさせると・・・

warning: UUID mismatch detected with the loaded library - on disk is:
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/TextInput/TextInput_ja.bundle/TextInput_ja
unable to load symbol file: warning: Unable to read symbols for /Users/なまえ/Library/Developer/Xcode/iOS DeviceSupport/5.0.1 (9A405)/Symbols/System/Library/TextInput/Riven.bundle/Riven (file not found).
warning: No copy of Riven.bundle/Riven found locally, reading from memory on remote device. This may slow down the debug session.
warning: UUID mismatch detected with the loaded library - on disk is:
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/TextInput/TextInput_ja.bundle/TextInput_ja

よりひどくなった^p^

英語サイトはいまいち解決策がわからず。へーーーるぷみーーーー!!!!

iOS:配列の定数をつくりたい。

■やりたいこと:
#define test 100
const int test = 100;
こーゆーのを配列で作りたい。
なるべく他と同じ様な感じで簡単にやりたい。

■どうするか:
調べたところ気になる回答発見。
(英語サイト)
http://stackoverflow.com/questions/2436463/how-do-i-declare-an-array-as-a-constant-in-objective-c
※コード部分のみ抜粋

#define arrayTitle [NSArray arrayWithObjects: @"hi",@"foo",nil]

で、実際使ってみたところ・・・

NSLog(@"%@",arrayTitle); → ○
NSLog(@"%@",[arrayTitle objectAtIndex:0]); → ○
NSLog(@"%@",[arrayTitle count]); → ×

うーん・・・。
よく考えたらNSArrayが定数っちゃ定数なんだが・・・グローバルで共有したいんだよなぁ。むむむ。

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が使われて、販売されてるアプリってなにがあるんだろうか?

iPad/Xcode4:SplitViewのRootとDetailのサイズを変更したい

■やりたいこと:
SplitView内のRootとDetailのサイズ(比率)を変更したい
左側を広くとりたい。


■どうするか:
時系列で。

・ぐぐったところ、MGSplitViewControllerという便利なライブラリがあるらしい。
(英語サイト)
http://mattgemmell.com/2010/07/31/mgsplitviewcontroller-for-ipad/

左右入れ替えたり、比率をドラッグで変更したり・・・なんという理想のライブラリ!


■+アルファなやりたいこと
・こいつとあわせて使いたい。
iPad/Xcode4:Tab Bar内にSplitViewっぽいものを作る
http://d.hatena.ne.jp/cn_t/20120122/1327224962


■進捗:
これからMGSplitViewControllerをくみこむぞー!
MGSplitViewControllerの単体での使い方とか日本語サイトが見当たらなかったのでできたらいーかもねー。

iPad/Xcode4:Tab Bar内にSplitViewっぽいものを作る

■やりたいこと:
・SplitViewをTabBar内にいれたい

■どうしたのか:
時系列順で。

・Xcode4, Storyboardあり,TabBarテンプレートで作成したアプリに追加しようとした。
 ->Storyboard、タブバーのリレーションでSplitViewに接続するのがよくわからず(Root,Detailはあるんだけど・・・)。
 ->もうちょい調べたかったが時間がないので断念。

・しゃーないのでネットでぐぐると英語サイトで同じような質問が。
(英語サイト)
http://stackoverflow.com/questions/7952214/tabbarcontroller-and-splitviewcontroller

一番上回答の人のサンプルを落としてきてこれを参考にすることに。
(手順2,3にでてくるIVARってなんだろう・・・?わかんなかった。だれかおせーてください。)

・サンプルを落としてみるとなんとなーく構造は理解。これをXcode4/Storyboardありで動作するように組み込む・・・が!
 ->TabbarテンプレートがわるいのかIBOutletでTabBarがひもづけられない。あああ時間がなくて調べられないのがつらい。

・あきらめて新規プロジェクト作成。
 ->Storyboardなし,TabBarテンプレートで作成

・作成したプロジェクト内AppDelegate.mにTabBarの記述発見!
 ->これだよこれ!!ってことでサンプルと同じように実装したら無事上手くいきました!!!