【iOS備忘録】キーボード非表示にする方法
TextField や TextView をタップして現れたキーボードを、タイミングよく非表示にする方法のメモです。
1.UITextField の場合
enter(改行)などのキーで非表示にするには、Did End On Exitのアクションを設定するだけでよい。コードは特に書かなくても良い。
hファイル
- (IBAction)didEndOnExit:(id)sender;
mファイル
- (IBAction)didEndOnExit:(id)sender {
}
2.UITextView の場合 (UITextField でも有効)
他の場所をタップしたらキーボードを非表示にするようにしよう。
Tap Gesture Recognizer をストーリーボードに配置。
hファイル
- (IBAction)onTap:(id)sender;
mファイル
- (IBAction)onTap:(id)sender {
[self.view endEditing:YES];
}
【iOS備忘録】 CSVファイル→plistファイル→読み込み
初期設定などのデータをCSVファイルで作っておいて、それを読み込ませる方法です。
1.CSVファイルをplistファイルに変換する
とても便利なツールが有ります。CSV2Plist というツールです。
CSV2Plist - Sheepapp からダウンロードしてデスクトップなどに置いておきましょう。
CSVファイルをドロップすれば自動的にplistファイルが生成されます。
図がCSVの編集画面です。ちなみにEXCELで編集してます。
ツールを使って生成したplistファイルです。
(補足)
CSV2Plist (Version 1.0.2)では、データに , (カンマ)が含まれていると変換できません。変換しようとしても何も反応しません。
csvファイルのカンマの数が合わないのが原因でしょうね。
特にEXCELで編集していると気が付きにくいので気をつけましょう。
2.plistファイルをプロジェクトに追加
fileメニューの [ Add Fils To …] でplistファイルを追加するか、ファイルをドロップして追加する。
3.初期設定として読み込む
NSString* path = [[NSBundle mainBundle] pathForResource:@"data"ofType:@"plist"];
NSArray *array = [NSArray arrayWithContentsOfFile:path];
4.読み込んだ配列を使う
for (int i=0; i<[array count]; i++) {
NSLog(@"Item%dの「項目1」は「%@」",i,[array[i] objectForKey:@"項目1"]);
}
実行結果
Item0の「項目1」は「あいう」
Item1の「項目1」は「かきく」
Item2の「項目1」は「さしす」
Item3の「項目1」は「たちつ」
Item4の「項目1」は「なにぬ」
5.ちなみに
CSVファイルではItem0の項目4にデータがありませんでしたが、plistになったらデータはどうなったのでしょうか。実行結果で見ると(null)ではありませんでした。存在しないkeyでは(null)が返されますが、CSV2Plistでは全てのItemで値を設定しているのが分かります。(null)ではなく、長さ0の文字列(@"")が入っているのですね。
Item0の「項目4」は「」
Item1の「項目4」は「」
Item2の「項目4」は「BCD」
Item3の「項目4」は「234」
Item4の「項目4」は「」
(比較)
Item0の「存在しない項目」は「(null)」
6.ちなみにちなみに
全てのItemの全ての項目を取得したいならfor in が便利ですね。ただし、取り出すkeyの順番通りではありません。
for (int i=0; i<[array count]; i++) {
for (NSString *key in [array[i] allKeys]) {
NSLog(@"Item%dの「%@」は「%@」",i,key,[array[i] objectForKey:key]);
}
}
実行結果
Item0の「項目4」は「」
Item0の「項目1」は「あいう」
Item0の「項目2」は「えお」
Item0の「項目3」は「ABC」
Item1の「項目4」は「」
Item1の「項目1」は「かきく」
Item1の「項目2」は「けこ」
Item1の「項目3」は「123」
Item2の「項目4」は「BCD」
Item2の「項目1」は「さしす」
Item2の「項目2」は「せそ」
Item2の「項目3」は「A」
Item3の「項目4」は「234」
Item3の「項目1」は「たちつ」
Item3の「項目2」は「てと」
Item3の「項目3」は「1」
Item4の「項目4」は「」
Item4の「項目1」は「なにぬ」
Item4の「項目2」は「ねの」
Item4の「項目3」は「abc」
7.ちなみに×3
for ;; や for in より処理速度を追求するなら enumarateObjectsUsingBlockを使う方が良いらしいです。これは、NSArray のインスタンスメソッドで、配列の中の要素を一通り呼び出してブロック文を実行します。停止フラグの *stop にYESを代入するとblock文から抜け出します。
[array enumerateObjectsUsingBlock:^(NSDictionary *dic, NSUInteger i, BOOL *stop) {
[[dic allKeys] enumerateObjectsUsingBlock:^(NSString *str, NSUInteger i, BOOL *stop) {
NSLog(@"Item%liの「%@」は「%@」",i,str,[dic objectForKey:str]);
}];
}];
実行結果(6.と一緒)
Item0の「項目4」は「」
Item0の「項目1」は「あいう」
Item0の「項目2」は「えお」
Item0の「項目3」は「ABC」
Item1の「項目4」は「」
Item1の「項目1」は「かきく」
Item1の「項目2」は「けこ」
Item1の「項目3」は「123」
Item2の「項目4」は「BCD」
Item2の「項目1」は「さしす」
Item2の「項目2」は「せそ」
Item2の「項目3」は「A」
Item3の「項目4」は「234」
Item3の「項目1」は「たちつ」
Item3の「項目2」は「てと」
Item3の「項目3」は「1」
Item4の「項目4」は「」
Item4の「項目1」は「なにぬ」
Item4の「項目2」は「ねの」
Item4の「項目3」は「abc」
LogicProXコンテンツを外付けドライブに変更する
と言っても、設定でドライブを変更することは出来ないようなので、シンボリックリンクという方法を使ってドライブを変更してみます。
もともとコンテンツは次のフォルダ内にすべてあります。
/Library/Application Support/Logic
ファインダーからは
ライブラリ > Application Support > Logic
と開きます。およそ30GBものサイズになるので、内蔵HDDから追い出してしまいましょう。移動先の外付けHDDは例えば
T1 > Logic
とします。T1 はドライブ名 、 Logicはフォルダ名です。ここに先ほどの30GBほどのデータをフォルダごとごっそり移動してしまいます。
さて、これを内蔵ドライブと同等に扱うために、次のような手順を行います。
1.ターミナルを起動
2.sudo ln -s /Volumes/T1/Logic /Library/Application\ Support/Logic
3.管理者パスワードを聞かれるので入力
ファインダーで
ライブラリ > Application Support > Logic
を確認してみましょう。そこにはファイルが無いはずなのに、あたかもあるかのように振る舞ってくれます。Logicを起動して正しく動いていることも確認して下さい。
さて、フォルダを元の状態に戻したいときは、
1.ターミナルを起動
2.sudo rm /Library/Application\ Support/Logic
とします。つまり、シンボリックリンクを解除するわけですね。そのあと、移動したフォルダ内容を元に戻しましょう。そうしないと、Logicはコンテンツが無いと思ってもう一度ダウンロードを始めることになります。おそろしや〜。
※ちなみにmacでバックスラッシュ『 \ 』は option+¥ で出ます。
【iOS備忘録】viewDidLoad
new project の SingleViewApplication で新しいプロジェクトを作ると、UIKitベースのプロジェクトが作られる。
run してみると、真っ白な画面が起動するが、とりあえず動くことだけは確認できる。ここに、いろいろ書き足していくことで、アプリになっていく。
まずは初期設定をしよう。
ViewController.mの中を見てinitメソッドを探してみる。が、ない。
大丈夫。ここではinitメソッドではなく、初期設定は、viewDidLoadメソッドに書き込めば良い。
- (void)viewDidLoad {
[super viewDidLoad];
//ここに初期設定を書き込む
}
【iOS備忘録】init で始まる
iOSプログラミング始めました。まったくのシロウトです。よろしくお願いします。
基本事項の備忘録として活用させていただきます。
何はともあれ、最初に初期化したいときはinitをオーバーライド(上書き)するんですね。
初期化処理が何もなければ、これはなくてもよい。
Objective-Cはオーバーライドのオンパレード。
オーバーライドしてるって意識することが、Objective-Cの理解を深めるようにも思います。
-(id)init{
if(self == [super init]){
//ここにこのクラスの初期化処理を記述
}
return self;
}
これが全ての始まり・・・って大げさ?