Objective-C

Xcodeの便利な機能

前回の記事で別のソースを簡単に探す機能を紹介しましたが、今回もちょっと便利な機能を紹介します。

ソースに記述された宣言等を簡単に参照する機能です。


1.「command」キーを押しながらクリック

ソースの適当な場所、例えば、プロトコルへの適合を記述した部分等で「control」キーを押してみてください。

ss-command.png

マウスカーソルが、手の形に変わりクリックできるようになります。クリックするとその宣言されているソースが開き、該当の場所へジャンプすることができます。これでどのようなメソッドが定義されているか簡単に調べたりできます。


他にも変数名の上で同様にすると、その変数の宣言場所へジャンプできます。

Xcode5で別のソースを素早く参照する方法

いつのバージョンのXcodeから実装されていたのかわかりませんが、今日Xcodeの便利な機能が分かりました。


ソースの編集中に、別のソースの内容を参照したくなる時があります。画面左側のプロジェクトナビゲータから探してクリックして選び直してもいいんですが、ソースの数が増えてくると目的のソースを探すのが大変になってきます。

そんな時はキーボードで、


「Command」+「Shift」+「O(オー)」

を押して、表示された小窓で目的のソースファイル名を入力してやるといいです。ソースファイル名といってもインクリメンタルサーチで部分一致するものを一覧表示してくれるので、5,6文字タイプしたところで後は一覧から選ぶだけでオッケーです。入力が終わったらEnterを押せば、そのソースを表示してくれます。

ss_popup.png

プロジェクト内のファイルに限らず、フレームワークのクラスや、メソッド名等も探すこともできます。

UIAlertViewのキーボードタイプを変える

iPhoneアプリでユーザに確認を求める場合等によくUIAlertViewを使います。


UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"削除の確認"
                                                    message:@"本当に削除してもいいですか?"
                                                   delegate:self
                                          cancelButtonTitle:@"はい"
                                          otherButtonTitles:@"いいえ", nil];
[alertView show];

confirm.png

CoreTextを調べてみた

CoreTextというのは、OSXやiOSで使えるテキスト描画用のフレームワークです。

iOS3.2の頃から使えていたらしいので特に新しいフレームワークというわけではありません。またiOSの場合はUIKitがテキスト描画もいい感じに面倒みてくれるのであまり使う機会もないように思います。

ただし、CoreGraphicsを使って画像を出力する目的でビットマップコンテキストへ日本語を描画しようとすると文字化けしてしまうので、そのような時にはCoreTextを使うと日本語も描画することができます。(画面への描画は日本語もちゃんと出力されます。また単にテキスト画像を生成する目的であれば、iPhoneで利用できるフォントを調べる(その2)で使ったやり方でも日本語の出力が可能(しかも簡単!)ですが、画像や文字を一緒にビットマップコンテキストへ描画する場合は、CoreTextフレームワークを使った方が便利です。またCoreTextを使うと、矩形だけでなく任意のパスを指定してその範囲に文字列を描画することができます。)

 

文字化けについてどういうことかというと、英数字等の半角文字は次のようにしてそのままビットマップコンテキストに描画できます。

NSAttributedStringを使ってみる

NSAttributedStringを使うと文字列を装飾して描画することができます。

使いたい属性をNSDictionaryに設定して、NSAttributedStringのインスタンスを生成することで属性付きの文字列を使うことができます。

後から属性を追加したり変更する場合は、NSMutableAttributedStringの方を使います。

 

NSAttributedString UIKit Additions Referenceを見るとiPhoneで使える属性として以下のようなものがあるようです。

 

iPhoneで利用できるフォントを調べる(その2)

前回の記事で作成したフォントの一覧をHTMLに出力してみました。 出力サンプルは画像で出力しています。次のようにして画像(UIImage)に出力しました。

- (UIImage *)makeImageWithFont:(UIFont *)font
{
    static NSString *text = @"ABC abc 123 あいう カキク 漢字";
    CGSize size = [text sizeWithFont:font];
    
    UIGraphicsBeginImageContext(size);
    [text drawAtPoint:CGPointZero
             withFont:font];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}
出力に必要な画像のサイズを取得して、グラフィックコンテクストに設定し文字列を出力しています。 出力が終わったらその内容をUIImageに取り込んでいます。

Obj-Cの可変配列を簡潔に記述

Xcode4.4(?)からObjective-Cで配列や連想配列の初期化にリテラル記法が使えるようになっています。

文字列については、もともと NSString *s = @"ABC"; といった簡潔な書き方ができていたのですが、同じような記法が、NSArrayやNSDictionary、NSNumberについても出来るようになっています。

 

以前はNSArrayのインスタンス生成を次のように書いていました。


NSArray *a = [[NSArray alloc] initWithObjects:@"A", @"B", @"C", nil];

それが、次のように簡潔に書けるようになっています。(もちろん今までの書き方も出来ます)


NSArray *a = @[@"A", @"B", @"C"];

NSDictionaryは次のように書けます。


NSDictionary *d = @{@"Name":@"Yamada", @"Job":@"Programmer"};

NSNumberは次のように書けます。

iPhoneアプリの国際化

アプリをつくる時には国際化のことも考えないといけません。

App Store は、150 を超える国で利用され、40 を超える言語をサポートしているとのことですが、これら全ての言語をサポートするのは無理としても、日本語の他にせめて、英語ぐらいはサポートしておきたいところです。

 

最初からiPhoneアプリを国際化するつもりでいる場合は、通常、アプリで使用するメッセージ類は全て英語で書いておいて、後からそれらに対応する翻訳用のファイルを用意することで対応します。C言語等で利用するgettextとpoファイルの関係に似ています。

デフォルトの言語を英語にしておけば 、翻訳していない言語でアプリが使用される場合は英語で表示されることになります。

 

国際化する場合は、まずXCodeのプロジェクトの設定で、ターゲットの言語を追加します。

ss1.png

プロジェクトで使用中のストーリーボードや文字列リソースの一覧が表示されるので、翻訳するファイルを選びます。

Objective-Cで可変引数

※本記事は、http://www.cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html を参考に(というかほぼそのまま意訳)しました。

 

Objective-CはC言語を拡張した言語なのでC言語と同じように可変引数も扱えます。

一般的に、書式文字列と、nil終端リストによる2つのパターンで可変引数を扱います。

 

書式文字列による可変引数

C言語のprintf系で使われている書き方で、書式文字列中のプレースホルダーの位置に引数を埋めてやるやり方です。プレースホルダは%で始まる書式指定子で指定します。

以下は、NSStringのstringWithFormathメソッドの例です。