おとうさまくんの手作り工房

日曜大工としてのプログラミングを紹介します。

【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 をストーリーボードに配置。

  f:id:otousamakun:20141124125611p:plain

 

   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で編集してます。

f:id:otousamakun:20141117010909p:plain

 

ツールを使って生成したplistファイルです。

f:id:otousamakun:20141117010923p:plain

 

(補足)

 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

 

 

YOSEMITE 残り約1分でフリーズ??

MacBook AirYOSEMITE にアップグレードしようとしたら、残り約1分という表示で1時間・・・

ぐぐってみると、「信じて待て」とある。しかたがないので、そのまま放置。

待つことさらに1時間。

長い1分が終わり、アップグレードが無事完了した。

 

TeXがインストールされていると、残り1分が長いらしい。しかし、同じ環境のMacBook Pro ではすんなりインストールできたので、「TeX=長い1分」とは限らない。CPUの速さ、メモリ、ハードディスクの容量の違いなどが影響するのだろう。

 

 

 

 

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;

}

 

 

 

これが全ての始まり・・・って大げさ?