【Xcode】UICollectionView で Grid 表示する

Grid(格子)状の表示は UICollectionView を使うとできる。

参考ページ

https://akira-watson.com/iphone/uicollectionview.html

以下はその手順。

1.storyboard に Collection View を設定する

Object Library から Collection View を選んで、 storyboard の View Controller に配置する。背景が黒で見にくいので、Light Gray に設定。

「View」->「Collection View」にある
「Show the Size inspector」アイコンを選択

例として、Cell を横に3つ入るように
Cell Size を 106 x 106 に
Min Spacing For Lines(セルの間隔)を 1 に
設定します。

参考:セルの間隔

2.Collection View Cell に名前をつけ、UIImageView と Label を配置

配置した Collection View には、すでに Collection View Cell がひとつ設定されているはず。そのCell の Identifier に再利用のためのIDを「Cell」と設定する。さらにその Cell の中に、ライブラリーからUIImageView と Label を持ってきて配置。
UIImageView の Attributes inspector で View Tag を「1」とセット。
Label の Attributes inspector で Tag を「2」とセット。
Label の文字色は白に設定。

3.必要な画像をプロジェクトに追加

photo1.jpg から photo10.jpg の画像を10個用意して「Add Files to “xxx”…」でプロジェクトに追加する。

4.ViewController にコードを記述

ViewController.h

UICollectionViewDataSource, UICollectionViewDelegate を設定

UICollectionViewDataSource → UICollectionViewを利用して表示するデータを提供するためのメソッドを定義するプロトコル。
UICollectionViewDelegate → UICollectionViewに対する選択等の操作を委譲するデリゲートプロトコル。

この二つのプロトコルを実装することで、 Collection View の Connecitions inspector の Outlets 欄に 「dataSource」「delegate」の二つの項目ができる。

UICollectionViewを構成するクラス

---------------------------------------
#import

@interface ViewController : UIViewController<UICollectionViewDataSource, UICollectionViewDelegate>

//Assistant editor にして、collectionView オブジェクトをドラッグして作成
@property IBOutlet UICollectionView *collectionView;

@end
---------------------------------------

ViewController.m

---------------------------------------
#import "ViewController.h"

@interface ViewController (){
NSString *selectedName;
}

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];

}

//section 数の設定、今回は1つにセット

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return 1;
}

//item 数、今回は10個

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return 10;
}


-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

UICollectionViewCell *cell;

//dequeueReusableCellWithReuseIdentifier の働きは、再利用できるセルがあればそれを使う、再利用できるセルがなければ生成する。

cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];

//storyboard 上の画像につけたタグに合わせて UIImageView のインスタンスを生成する。タグが一致しないと反映されない。

UIImageView *imageView = (UIImageView *)[cell viewWithTag:1];
NSString *imgName = [NSString stringWithFormat:@"photo%d.JPG", (int)(indexPath.row+1)];
UIImage *image = [UIImage imageNamed:imgName];
imageView.image = image;

//storyboard 上の画像につけたタグに合わせて UIImageView のインスタンスを生成する。タグが一致しないと反映されない。

UILabel *label = (UILabel *)[cell viewWithTag:2];
label.text = [NSString stringWithFormat:@"No.%d",(int)(indexPath.row+1)];

//背景色の設定。緑。

cell.backgroundColor = [UIColor greenColor];
return cell;
}

//おまけ
//アイテムをセレクトした時の起こるイベント
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {

}

@end
---------------------------------------

storyboard に戻って Collection View を選択して右クリック。もしくは右端の Connection inspector を開く。
Outlets 欄の dataSource -> view Controller
Outlets 欄の delegate -> view Controller
New Referencing Outlet -> collectionView
とそれぞれ結ぶ。「dataSource」と「delegate」は UICollectionViewDataSource と UICollectionViewDelegate を実装したことでできたもの。

ビルドして実行。

以上。

配列内の値を表示させる場合は、以下のように変更追加する。

ViewController.m

//配列を作る
---------------------------------------------------
@implementation ViewController {

NSArray *testArray;

}
---------------------------------------------------

//配列をセット
---------------------------------------------------
- (void)viewDidLoad {

testArray = [NSArray arrayWithObjects:@"うさぎ",@"かめ",@"きじ", nil];

}
---------------------------------------------------

---------------------------------------------------
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {

//return 10;
//配列の数だけ返す
return [testArray count];
}
---------------------------------------------------

---------------------------------------------------
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

UICollectionViewCell *cell;

cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];

UILabel *label = (UILabel *)[cell viewWithTag:1];
//label.text = [NSString stringWithFormat:@"No.%d",(int)(indexPath.row+1)];
label.text = [testArray objectAtIndex:indexPath.row];
return cell;

}
---------------------------------------------------

windowsのmysqlデータをmacのsqLiteで読み込む手順

windowsのmysqlデータをmacのsqLiteで読み込んだときの手順 覚書

1.phpmyadminからCVSファイルでデータをダウンロード。「1 行目にフィールド名を追加する」に必ずチェックを入れる。

2.Macにデータをコピー。Mac から Windows の共有ファイルにアクセスするときは、Finder 横の「サーバへ接続」から。

3.DB Browser for SQLiteにCVSファイルをインポート

「File」-「Import」-「Table from CSV file」の順に操作。
「Table from CSV file」は、あらかじめ DB Browser for SQLite でデータベースファイルを読み込んでおかないと選択できないので注意。

インポートが完了すると、拡張子なしのファイルが保存されるので、わかりやすく「~.db」や「~.sqlite」などとリネームするといい。

macでwindowsの共有サーバーへアクセスする方法

macからwindowsの共有サーバーへアクセスしたときの覚書

1.「Finder」-「移動」-「サーバーへ接続」

2.サーバアドレスを入れる

例:
-------------------------------
smb://192.168.xxx.xxx
-------------------------------
※SMB(Server Message Block)は、Mac OS X で採用されているファイル共有のプロトコル。Microsoft などが開発。

3.ID と Password を入力

以上

MacのターミナルからSQLiteを実行

MacのターミナルからSQLiteを実行したときの覚書

1.ターミナルの起動

Finder の「移動」-「アプリケーション」-「ユーティリティ」-「ターミナル」

2.ターミナルでSQLite の実行

データベースファイルのある場所まで cd で移動する。例えばデスクトップになる場合。

//コマンド
-------------
cd Desktop
-------------

移動したらデータベースファイルを指定して、デフォルトでインストールされている SQLite を起動。例としてデータベースファイル名を「test.db」だった場合。

//コマンド
-------------
sqlite3 test.db
-------------

するとターミナルに「sqlite>」と表示されるので、SQLを実行。

//抽出
-------------
sqlite> select * from testdb;
-------------

参考:こちら

【Objective-C】UILabel(ラベル)で改行する方法

myLabel.text = @"ラベルも\n改行できます";

//行数を指定。0だと無制限
myLabel.numberOfLines = 2;
myLabel.text = @"改行\nできる";

※「\」は、「\」の半角文字。[option] + 「¥」で入力できる。

【Objective-C】labelでHello World!と表示する

labelでHello World!と表示するテスト

ソース
-------------------------------------------------
//UILabelオブジェクトの生成
UILabel *label = [[UILabel alloc] init];
//UILabelはラベルを管理するクラス。画面に文字を表示させる時に使用。
//[[クラス名 alloc] init] → init メソッド(イニシャライザ)でオブジェクトを初期化。
//alloc → インスタンスの生成に必要なメモリ容量を確保する。allocation(アロケーション)は「割り当て」の意。

//textプロパティで文字を設定
label.text = @"Hello World!";

//UILabelで高さを動的に変える。テキストを設定した後に行う。
[label sizeToFit];

label.center = self.view.center;
[self.view addSubview:label];
-------------------------------------------------

【Objective-C】FMDBでテーブル内の情報を出力する

FMDBでテーブル内の情報を出力するソースコード

前提として

  1. FMDBが導入されている(導入方法はこちら)。
  2. test.dbというファイルが iOS Simulator の Documents ディレクトリにある(iOS Simulatorののパスについてはこちら)。このディレクトリに直接データファイルを置くと、シミュレーターのバージョンごとにデータファイルを置く必要があるので面倒。解決策として、Supporting Files 内にデータファイルを置いておいて、アプリ起動時に Supporting Files 内にデータがない場合に Documents ディレクトリにコピーする方法がある。詳しくは、こちら
  3. title というカラムにデータが既に入っている

ソースコード
----------------------------------------------------------------
//インポート(ヘッダーファイル)
#import "FMDatabase.h"
----------------------------------------------------------------

----------------------------------------------------------------
- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

// パスとDBファイル名を指定

NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);

NSString *dir = [paths objectAtIndex:0];

//test.db はファイル名
NSString *db_path = [dir stringByAppendingPathComponent:@"test.db"];

FMDatabase *db = [FMDatabase databaseWithPath:db_path];

//データを抽出

[db open];

//testdb はテーブル名
FMResultSet *rs = [db executeQuery:@"select id,title from testdb"];

while ([rs next]){

// 出力

NSString *text1 = [rs stringForColumn:@"title"];

//UIlabelクラスのインスタンスを生成。
//alloc でインスタンスの生成(allocationはメモリの割り当ての意)。init で初期化。
UILabel *label = [[UILabel alloc] init];

//labelオブジェクトにテキストを設定
label.text = text1;

//コンテンツの大きさの合わせてUIViewの大きさを変える。UIViewはUIlabelの親クラス。
[label sizeToFit];

//行数の指定。0は、表示可能な最大行数。(インスペクターでの設定も可だがソースが優先される)
label.numberOfLines = 0;

label.center = self.view.center;

[self.view addSubview:label];

// 出力 ここまで

}

[rs close];

}
----------------------------------------------------------------

結果をラベルに表示せずに、配列に入れる場合はスクリプト後半を以下のように変更する

----------------------------------------------------------------
//データを抽出

[db open];

FMResultSet *rs = [db executeQuery:@"select id,title from testdb"];

while ([rs next]){

// 出力

NSString *text1 = [rs stringForColumn:@"title"];

//配列を追加。配列の型は必ず NSMutableArray であること。NSMutableArray は不可。
[testArray addObject:text1];

//UIlabelクラスのインスタンスを生成。
//alloc でインスタンスの生成(allocationはメモリの割り当ての意)。init で初期化。
// UILabel *label = [[UILabel alloc] init];

//labelオブジェクトにテキストを設定
//label.text = text1;

//コンテンツの大きさの合わせてUIViewの大きさを変える。UIViewはUIlabelの親クラス。
//[label sizeToFit];

//label.center = self.view.center;

//[self.view addSubview:label];

// 出力 ここまで

}

[rs close];
----------------------------------------------------------------

【xcode】FMDBでThe FMDatabase is not openエラーが出る

Objective-C で記述したソースを run するとコンソールにエラーが出た

エラー内容
--------------------------------------------------------
2015-xx-xx 19:xx:xx.xxx FMDBTest[xxxx:xxxxxx] The FMDatabase <FMDatabase: xxxxxxxxxxxxxx> is not open.
--------------------------------------------------------

原因と解決策

原因:下記の記述が反対だった
--------------------------------------------------------
FMResultSet *rs = [db executeQuery:@"select id,title from testdb"];
[db open];
--------------------------------------------------------

解決策:記述の順番を入れ替えた
--------------------------------------------------------
[db open];
FMResultSet *rs = [db executeQuery:@"select id,title from testdb"];
--------------------------------------------------------

【Xcode6】iOS SimulatorのDocumentsまでのパス

iOS SimulatorのDocumentsまでのパスはこれ
------------------------------------
~/Library/Developer/CoreSimulator/Devices/{simulated device UUID}/data/Containers/Data/Application/{application UUID}/Documents/
「~」はホームディレクトリのこと。「Macintosh HD」 の下の「ユーザ」の下の「ユーザ名」のディレクトリ。
------------------------------------

simulated device UUID は、Xcode の「Window」-「Devices」から起動した Simulator を選択すれば分かる。「identifier」の項目。

でも分かりにくいので、「SimPholders2」というアプリを使うといい。

ダウンロードはこちら

参考ページ:

http://qiita.com/singo405/items/b84f81ee2daaef27d0a2

【xcode】FMDB導入方法

FMDB は SQLite を iOS の Objective-C で扱いやすくするための Wrapper ライブラリ。GitHub で公開されている。

1.あらかじめ「libsqlite3.0.dylib」を追加しておく

SQLiteを使用するために「Targets」->「Build Phases」->「Link Binary With Libraries」から「libsqlite3.0.dylib」を追加しておく。

詳細はこちら

2.FMDBをアプリに組み込む

プログラムをこちらからダウンロード。

ダウンロードしたディレクトリ内のfmdb-master/src/ 配下にある fmdb というディレクトリを、ディレクトリXcodeのプロジェクトフォルダ内(プロジェクト名のフォルダ直下、MasterViewController.h などがあるところ)に xcode の project navigator エリアに直接ドラッグして置く。ただし、「fmdb.m」という名前のファイルだけ外しておく(main 関数が実装されていて、ビルド時にコンパイルエラーが出る)。

fmdb ディレクトリをプロジェクト内に置くときはナビゲーターエリアに直接ドラッグする

詳細はこちら

「Choose options for adding these files」のダイアログが出るので「Destination Copy items ~」にチェックを入れることでアプリに組み込める。

3.インポート

ソースコード
----------------------------------------------------------------
#import "FMDatabase.h"
----------------------------------------------------------------
ヘッダーファイル(.h)でも実装ファイル(.m)でもどちらでもいい。

ビルドしてエラーが出なければOK。