沖縄が日本のシリコンバレーのようになってほしいと願うiOSエンジニアのブログ

世のエンジニアの役に立つようなブログにしたいなぁ

iPhoneSDKで画像をSQLiteに保存する

iPhoneで画像をライブラリではなくて、アプリ自体に保存したいなと思って見つけた記事。
画像のバイナリをDB保存したことがないので、この機会にやってみようと思ってメモ。

iPhone SDK でUIImageの画像をSQLiteのDBに格納する方法 - iPhoneSDK他いろいろ 開発メモ

iPhoneSQLiteを使う方法はこちらを参照

iPhoneSDKでSQLiteを使う方法 - iPhoneSDK他いろいろ 開発メモ

InterfaceBuilderを使わずiPhoneアプリを開発

three20などの、iphoneアプリ開発ライブラリを使う際、Window-based Applicationのテンプレートなどで、デフォルトで設定されるnibファイルを使わず、メイン画面から独自のビューをつくって開発したい場合などに、nibファイルを削除する場合の手順をメモ。


1.Window-based Applicationを選択
2.MainWindow.xibを削除
3.アプリの起動時に nib ファイルを読み込まないように、 plist ファイルのエントリを削除
 (1) *****-Info.plist (***** は作成したプロジェクト名)をダブルクリックで開く
 (2) 一番下にある「Main nib file base name」という項目を削除

4.デフォルトでは、フレームワークは nib ファイルから適切な Delegate クラスを取得しているが、その nib ファイルを削除したので、起動時に Delegate クラスを明示的に指定する必要がある。
 (1) main.m の UIApplicationMain() の呼び出しを、以下のように書き換える

int retVal = UIApplicationMain(argc, argv, nil, @"*****AppDelegate");

(以降は必須ではない)
5.Delegate クラスの @property, @synthesize を削除してしまってかまいません。
 (1) Classes/*****AppDelegate.h の以下の行と

@property (nonatomic, retain) IBOutlet UIWindow *window;

 (2) Classes/*****AppDelegate.m の以下の行が削除できます。

@synthesize window;


Interface Builder を使わない iPhone アプリを作る手順 - WebOS Goodies


Interface Builderを使わずに作るiPhoneアプリケーション作成入門 : アシアルブログ


ちなみに、上記の手順を毎回行ないたくない場合、nibファイルを使わないテンプレートを作成したい場合は、下記参照


nibファイルを使わないテンプレートを作る(1)Window-Based Application - ねこじたclockwork


InterfaceBuilderを使ってViewをたくさん作成すると、iPhone実記のリソースを多く使うことになって、処理が軽くならないそうです。
特にゲーム画面などでは、入力から出力までのレスポンスをすばやく行なう必要があるので同一View内で画面繊維させるほうがいいみたいです。

View-based ApplicationとWindow-based Applicationの違い

iphoneアプリを作る上で、View-based ApplicationとWindow-based Applicationをよく使うと思いますが、これの違いを、よく忘れれるのでメモ。


iPhoneアプリ画面をInterface Builderで作っていく場合、

1. 一番下に土台となる「Window」を配置し、
2.そのWindowの上に、透明なレイヤー「View」を何枚も重ねて配置し、
3. さらにそのViewの上に、ボタンやスライダーバー等のインターフェース・オブジェクトを配置します。

要約すると、


Windowだけ設定してあるテンプレートがWindow-based、
WindowにViewが1つだけ設定してあるテンプレートがView-based


「View-based Application」は、「Window-based Application」にViewが1つ済みのテンプレートです。

主な違いは、classesにcontrollerが追加され、Resourcesにのxibが追加されています。

参考

テンプレートの選び方 その2|サルにもできるiPhoneアプリの作り方

Creationlin,inc. | クリエーションライン株式会社 | Private Cloud プライベートクラウド構築サービス


ちなみに、View-based Applicationから、Window-based Applicationを作る場合は、下記参照。
実際に、手順を踏むことで、違いがよくわかる。


(旧) Cocoa Touch の日々: "Window-based Application" から組み立ててみる

テキストリンクを作るブックマークレット

ブログやWEBサイトに、外部サイトのリンクを参照する際、テキストリンクを張ることがあると思いますが、いちいちhtmlタグを書くのは、面倒です。

なので、自分はいつも、スクリプトレットという方法で、リンクを張っています。

参照
テキストリンク作成ブックマークレット | gerenuk.crazyphoto.org/

InterfaceBuilderを使わずiPhoneアプリを開発したものを元にもどす

InterfaceBuilderを使わずiPhoneアプリを開発したものを、メイン画面や設定画面はやっぱ、InterfaceBuilder使いたいなーと思って、いったん、削除したnibファイルを元に戻す作業をやってみましたのでメモ。

1.「Resources」にMainWindow.xibを追加
新規ファイル作成を選び 「User Interface」− 「Application XIB」を選択する。
名前は 「MainWindow.xib」 とする。

2.アプリの起動時に nib ファイルを読み込むように、 plist ファイルのエントリを追加
 (1) *****-Info.plist (***** は作成したプロジェクト名)をダブルクリックで開く
 (2) セレクトボックスで「Main nib file base name」という項目を選択し、「MainWindow」と入力

3.デフォルトでは、フレームワークは nib ファイルから適切な Delegate クラスを取得しているため、その nib ファイルを追加したので、起動時に Delegate クラスを明示的に指定する必要がなくなった。
 (1) main.m の UIApplicationMain() の呼び出しを、以下のように書き換える

int retVal = UIApplicationMain(argc, argv, nil, nil);

4.Delegate クラスの @property, @synthesize を追加
 (1) Classes/appnameAppDelegate.h の以下の行と

UIWindow *window;
@property (nonatomic, retain) IBOutlet UIWindow *window;

 (2) Classes/*****AppDelegate.m の以下の行を追加

@synthesize window;


5.MainWindow.xib をダブルクリック

6.*****AppDelegate を選択し、identityのclassで「*****AppDelegate」を選択


7.*****AppDelegateのoutletのwindowsをwindowsと紐づける

8.

InterfaceBuilderを使わずiPhoneアプリを開発したものを元にもどす

InterfaceBuilderを使わずiPhoneアプリを開発したものを、メイン画面や設定画面はやっぱ、InterfaceBuilder使いたいなーと思って、いったん、削除したnibファイルを元に戻す作業をやってみましたのでメモ。

1.「Resources」にMainWindow.xibを追加
新規ファイル作成を選び 「User Interface」− 「Application XIB」を選択する。
名前は 「MainWindow.xib」 とする。

2.アプリの起動時に nib ファイルを読み込むように、 plist ファイルのエントリを追加
 (1) *****-Info.plist (***** は作成したプロジェクト名)をダブルクリックで開く
 (2) セレクトボックスで「Main nib file base name」という項目を選択し、「MainWindow」と入力

3.デフォルトでは、フレームワークは nib ファイルから適切な Delegate クラスを取得しているため、その nib ファイルを追加したので、起動時に Delegate クラスを明示的に指定する必要がなくなった。
 (1) main.m の UIApplicationMain() の呼び出しを、以下のように書き換える

int retVal = UIApplicationMain(argc, argv, nil, nil);

4.Delegate クラスの @property, @synthesize を追加
 (1) Classes/appnameAppDelegate.h の以下の行と

UIWindow *window;
@property (nonatomic, retain) IBOutlet UIWindow *window;

 (2) Classes/*****AppDelegate.m の以下の行を追加

@synthesize window;


5.MainWindow.xib をダブルクリック

6.*****AppDelegate を選択し、identityのclassで「*****AppDelegate」を選択


7.*****AppDelegateのoutletのwindowsをwindowsと紐づける

8.applicationDidFinishLaunchingメソッドに、以下の行を追加

[window makeKeyAndVisible];


あとは、「画面遷移を起こすボタン追加」して、もともと、「applicationDidFinishLaunching」で記述してた処理(ビューの初期化など)を、ボタンのアクションへ移したりなどしてください。

Objective-Cのプロパティについて

プロパティを設定する場合の、「nonatomicとretainやassign」の指定について、何だろうと思って、調べてみたら、以下のように設定するそうです。

                                        • -

普通の変数についてはnonatomicとassignを、 自分で使うビューやラベル、配列、ディクショナリーなどにはnonatomicとretainを、文字列やデータなどにはnonatomicとcopyを設定するようです。 BOOL値については細かい属性はつけずそのまま書くだけで良いようです。

@property (nonatomic, assign) NSInteger integerValue;
@property (nonatomic, retain) NSMutableArray *myArray;
@property (nonatomic, copy) NSString *myString;
@property BOOL myBoolValue;