inner-impl
inner-impl
IMPLOG
58 posts
株式会社インプルの開発者のブログです。 役に立つ情報から役に立たない情報まで。
Don't wanna be here? Send us removal request.
inner-impl · 12 years ago
Text
【iOSアプリ開発】BackgroundTask
みなさんこんにちは
今日も変わらずiOSアプリ開発です
本日は長い処理を実行中にバックグラウンドになってしまったときの対処法です。
長い処理、例えば画像のアップロードやダウンロードなどですね。
通常このような処理を実行中にバックグラウンド状態になると、処理は中断されてしまいます。
節電のための自動スリープ機能や退屈だから他��画面をみようとした瞬間、処理が止まってしまったら元も子もありません。
ではどうすればいいかを記載致します。
iOSにはバックグラウンド状態になっても一定時間処理を続けるという仕組みがあります。
それが以下です。
 UIApplication *application = [UIApplication sharedApplication];
 _bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
 dispatch_async(dispatch_get_main_queue(), ^{
 if (_bgTask != UIBackgroundTaskInvalid) {
 [application endBackgroundTask:_bgTask];
 _bgTask = UIBackgroundTaskInvalid;
 }
 });
 }];
 // ここに処理を書く
 [application endBackgroundTask:_bgTask];
 _bgTask = UIBackgroundTaskInvalid;
「ここに処理を書く」と言うところにバックグラウンド状態になっても実行したい処理を書きます。
 これで一定時間(約10分ほど)処理を中断せずに実行してくれます。
 上記を利用する際は
 UIBackgroundTaskIdentifier bgTask;
 をどこかで予め宣言しておいてください。(変数名はお好みで)
 以上で紹介をおわります。
 担当:Y.M
0 notes
inner-impl · 12 years ago
Text
【iOSアプリ開発】NSTimer
みなさんあけましておめでとうございます。こんにちは。
今年も変わらずやっていきます。
よろしくお願い致します。
さて、新年初のテーマはNSTimer、その名の通りタイマーです。
なんとなく今更感がしますね(^^;
 そんなことは気にせず進めます。
 ご存知かも知れませんが、使い方は簡単でセットの仕方は
 timer = [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(timerEvent:) userInfo:nil repeats:YES];
 // 30秒後にtimerEventを実行する
 止め方は
 if([timer isValid]) [timer invalidate];
となります。 
 allocやinit等がない少々特殊なクラスですね。
 では今回は、このタイマーを複数・バックグラウンドで使用する際に気をつけることを記載します。
 バックグラウンドで使用する際のスタートは
 timer = [NSTimer timerWithTimeInterval:30 target:self selector:@selector(timerEvent:) userInfo:nil repeats:YES];
 こちらを使用します。
 そっくりですが、別物です。
 そして複数個あるタイマーを
 [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
 のようにメインスレッドで動かすようにします。
 これでバックグラウンドでも複数のタイマーを使うことも可能になりました。
 とくに注意点はNSTimerの生成方法ですね(自分が詰まったので)。
 ご利用の際はくれぐれもご注意ください。
 ちなみに止め方はどちらも同じです。
 担当:Y.M
0 notes
inner-impl · 12 years ago
Text
【iOSアプリ開発】ios7でUIAlertView
みなさんこんにちは。
お元気にお過ごしでしょうか?
今回はiOS7になって変わってしまったUIAlertViewについてです。
iOS6まではAlertViewでaddSubviewが可能でした。
Tumblr media
しかしiOS7になってからはaddSubviewをしても無視されてしまうようです。
Tumblr media
  このようにIndicatorが表示されません。
AppleとしてはUIAlertViewに何かを乗せるのは喜ばしくないみたいですね。
このほかにもViewサイズの変更も出来なくなっています。
どうやらUIActivityIndicatorを表示したいのであれば、
自身でUIViewから用意しなさいということなのでしょう。 
しかし、Developer Forums(要ログイン)を調べてみると、回避策がありました。
https://devforums.apple.com/message/886561
 [alert addSubview:indicator];
 としているところを
 [alert setValue:indicator forKey:@”accessoryView”];
 と変更すれば良いようです。
Tumblr media
このように表示することが可能です。
ただし、申請でRejectされる可能性があるので自己責任で行ってくださいとのことです。
担当:Y.M
0 notes
inner-impl · 12 years ago
Text
使い勝手と見た目
今年もあと一か月、本年も頑張って生き残れたと自分をほめてやりたい今日この頃、みなさまいかがお過ごしでしょうか?
今回は技術的なお話ではなく、使いやすさと見た目のお話。
テキスト部分をタッチした際にテキストが変更する処理を入れてやるとする、確かに見た目は余計なものが出ないし、タッチだけでテキストが変わるから便利だと思うが、変更するテキストが5種類を超えると、間違った際にまた5回タッチしなおさないといけないし、間違って触れた場合気が付かないのではないだろうかと思う。昔ガラケーでメールの文章を作っていた時に何度も通り過ぎた記憶があるためか、この方法が良いとは思えない。
では、selectを使ってその中から選ぶのではどうだろう、使い勝手は必ずタッチする回数が決まっているため平均的に使いやすいのではないだろうか、しかし小さなマスにボックスが表示されるためレイアウトが崩れてしまう。選んだ後はもとに戻るものの、見た目は悪いと思う。
ではいっそのことダイアログで表示してやったらどうだろうか、そうすれば2タッチで処理は終わるし画面の崩れもない。これは良い考えだと思ったが、変更する箇所が100を超えていると、毎回画面にダイアログが表示されるのはどうだろうか?目が疲れたりとかしないのだろうか?
実際、それなりにいいものを使って慣れてしまえば、それよりも少しいいものでもうざく感じてしまう物だが、それなりにいいものが中々思いつかないのが現状で、上記に書いた物を一度作って、周りに使ってもらってのリサーチしかないのかなと頭を抱える今日この頃でした。
執筆者 ちびた
0 notes
inner-impl · 12 years ago
Text
【iOSアプリ開発】FMDB その2
 みなさんこんにちは。
 お元気にお過ごしでしょうか?
 今回は前回に引き続きFMDBについてです。
 前回は書き込みについて記載しましたが、今回は読み込みについて記載します。
 NSArray  *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
 NSString *dir   = [paths objectAtIndex:0];
 FMDatabase *db = [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:@”ファイル名”]];
 NSString *SQL = @”ここにSQL文を書く”;
 [db open];
 [db beginTransaction];
 // ここで読み込み
 [db close];
 OpenとCloseは前回と同じですね。
 またこれを基本として読み込みます。
 まずはSQL文の「ここにSQL文を書く」と言うところからです。
 NSString *SQL = @”SELECT * FROM テーブル名”;
 これだけです。
 次に「ここで読み込み」のところです。
 FMResultSet *results = [db executeQuery:SQL];
 while( [results next] ) {
    // = [results stringForColumnIndex:0];
    // = [results intForColumnIndex:0];
    // = [results doubleColumnIndex:0];
    // = [results dataCulumnIndex:0];
 }
 ここはexecuteUpdateではなくexecuteQueryなことに注意です。
 そしてwhile文で一レコードずつ取り出し、
 型に合わせてstringForColumnIndexやintForColumnIndexなどを使います。
 ColumnIndexはその名の通りテーブルのColumnの番号です。
 これで書き込みも読み込みも出来ますね。
 それではこの辺で。
 お疲れさまでした。
 担当:Y.M
0 notes
inner-impl · 12 years ago
Text
【iOSアプリ開発】FMDB
みなさんこんにちは。
お元気にお過ごしでしょうか?
  本日はiOSで簡単にSQLiteが使えるようになる、FMDBというライブラリについてです。
上で簡単とか言ってますが、正直私はまだほとんど理解していないです。
ということで、初歩的なところを紹介します。
  NSArray  *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
NSString *dir   = [paths objectAtIndex:0];
FMDatabase *db [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:@"ファイル名"]];
NSString *SQL = @"ここにSQL文を書く";
[db open];
[db beginTransaction];
  if( ![db executeUpdate:SQL] ) {
 [db rollback];
}
  [db commit];
[db close];
この形が基本となり、テーブルの作成や行の追加などの操作を行います。
・CREATE テーブルを作成する
NSString *SQL = @"CREATE TABLE IF NOT EXISTS テーブル名 (id INTEGER, name TEXT)";
IF NOT EXISTS はテーブル��存在しないときにだけ作成する。
後はテーブル名を決め、()内に必要な項目とデータ型を指定する。
  ・INSERT 行を追加する。
NSString *SQL = @"INSERT INTO テーブル名 (id, name) VALUES (?,?)";
追加するテーブルと()内に項目を指定。そしてVALUES後の()で値を指定する。
?の部分は
[db executeUpdate:SQL, @"1", @"名前"];
と記述することで、可変長引数の2番目以降を割り当てていく。
・DELETE 行を削除する
NSString *SQL = @"DELETE FROM テーブル名 WHERE id = ?";
テーブル名と可変長引数2番目にidを指定すると、そのidの行が削除される。
  ・UPDATE 更新する
NSString *SQL = @"UPDATE テーブル名 SET name = ? WHERE id = ?";
テーブル名を指定し、idに対応したnameが変更される。
簡単に各操作を紹介しました。
これらを使い、DBを作成していきます。
とりあえず長くなりましたのでここら辺で。
担当:Y.M
0 notes
inner-impl · 12 years ago
Text
【iOSアプリ開発】ハッシュ
みなさんこんにちは。
お元気にお過ごしでしょうか?
毎回のことですがタイトル通りで、今回はObjective-Cでハッシュ値の求め方についてです。
以下のコードでハッシュ値を求めることができます。
- (NSString *)getHash:(NSString *)text
{
    if( text.length == 0 ) return nil;
    CC_LONG len = text.length;
    const char *data = [text UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(data, len, result);
    NSMutableString *ms = @”“.mutableCopy;
    for( int i = 0 ; i < 16 ; i++ ) {
        [ms appendFormat:@”%02x”, result[i]];
    }
    return ms;
}
また、このコードを使用するにあたり
#import <CommonCrypto/CommonHMAC.h>
Importとしてこの一文を忘れず追加が必要です。
ハッシュについてはこの他にもいろいろな方法があるので、試してみるのもよいかと思います。
担当:Y.M
0 notes
inner-impl · 12 years ago
Text
ブラウザ パスワードの保存
いよいよ、寒くなってきましたが、最近ダウンジャケットが欲しくなりどこか安い店は無いかとみんなに触れ回っていたら、親の知り合いが24800円のダウンを買ってくれて、荷物の到着が待ちどおしい今日この頃、みなさまいかがお過ごしでしょうか?
今回はスマホのブラウザのお話です。
ログイン画面でIDとパスワードを入れてログインボタンを押すと「パスワードを保存しますか?」と尋ねられたので、保存を選択すると、後に違うページでの似たような入力欄にログイン画面のIDとパスワードが初期値で入力されている始末、これはいただけないという事で、
formタグにautocomplete="off"を追加するとIDとパスワードは保存されなくなりました。
フォームのフィールドに、autocomplete="off"が指定されていると、ブラウザはこの機能を働かせないという約束になっているらしく、パスワードがautoで入力されないどころか、「パスワードを保存しますか?」の問いかけも出なくなりました。
執筆者 ちびた
0 notes
inner-impl · 12 years ago
Text
【iOSアプリ開発】 Apple Mach-O Linker Error
みなさんこんにちは、お元気にお過ごしでしょうか?
 今回もエラーについてです。
  Apple Mach-O Linker Error 
このエラー、調べるとすぐにたくさん解決方法が見つかるエラーになります。
 原因はSourceファイルがコンパイル対象にない、と言ったようなエラーになります。
解決方法は
Tumblr media
  Build Phases(上)画面Compile Sourcesの[+]ボタンで足りないSourceファイルを追加します。
また、ファイル名が重複している場合や、必要なフレームワークが追加されていない場合も発生するようです。
  さて、何故調べれば簡単に解決方法が見つかるこのエラーについて取り上げたのかと言うと、上記の方法で解決しなかったからです。
たいていは上記の方法で解消されるのですが、今回自分は大変間抜けなミスをしてこのエラーを発生させていたので、
それについても記載しておきたいと思います。
  では原因についてなのですが、これはSourceファイルがないと言うことで��なく、implementつまり実装をしていないことで発生しました。
ヘッダーファイルでinterface宣言をしているのにimplementをせず、そのクラスを使用するということです。
  解決方法はもちろん実装することです。
  このエラーが解消できず、思いの外時間をとられてしまいました。
今後同じようなことをしない為にも残しておきたいと思います。
  何事も少し慣れてきた時期が一番気を付けたいですね。
担当:Y.M
1 note · View note
inner-impl · 12 years ago
Text
Android4.1、Android4.2標準ブラウザ
風でのどが痛く固形物を飲み込むたびに涙が出てくる今日この頃、みなさまいかがお過ごしでしょうか?
今回はAndroidのブラウザの話しですが、はっきり言って何が問題なのかよくわかりません。不可思議な現象が起こったとしか思えませんが、とりあえず回避は出来たので記述しておきます。
標準ブラウザからwebサイトを見たときに起こったのですが、imgタグで呼び出していた画像が表示されなかった。
サーバーとの通信がおかしいのかと思ったのだがlogを見てみるとちゃんと200を返している。でも表示はされていない、リロードすると表示され、ブラウザを閉じるまではその現象は起こらないが、次もまた同じところで発生する。
現象が起こらない場所も起こる場所も画像の表示は同じ書き方なので、問題があるとは考えにくい・・・。
考えても解らないので手当たり次第に試してみた。
うまくいったのは次の二点、
1.問題の箇所をimgタグをやめてjavascriptから呼んでやる。
2.高さが同じで横幅の違う画像を表示していたためCSSで高さ固定、横幅autoにしていたものを問題のある個所だけ、高さ横幅ともに固定した。
最初に1を試すと回避できたところもあるが、それでは回避できないところもあったので2を追加してみた。両方必要だったり片方でよかったりととても面倒なことになっている。
端末のバージョンが問題なのかとも思ったが、chromeに変えるとこの現象は起こらなかったので、問題はブラウザと判断しました。
ただ、なぜこれで回避できたのかは不明でとても気持ちの悪い今日この頃でした。
執筆者 ちびた
0 notes
inner-impl · 12 years ago
Text
【iOSアプリ開発】CIDetector
こんにちは。 私は最近よく黒と緑と青の判別が出来ない症状に悩まされておりますが、みなさんはお元気にお過ごしでしょうか?
本日はiOSで簡単に顔の認識ができるCIDetectorの使い方についてです。
では順��に、まずCIDetectorを作成します。
NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyHigh, CIDetectorAccuracy, nil];
CIDetector *detector = [[CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions]];
最初の行で検出の精度をオプションとして指定します。
太字の部分が該当箇所で、上記の他CIDetectorAccuracyLowを選択することが出来ます。
目的にあった処理速度、検出精度に合わせて選択すると良いかと思います。
あとはテンプレみたいなもので、顔を検出したいUIImageを用意し
NSArray *features = [detector featuresInImage:uiImage.CGImage];
これで画像内から検出された顔情報は配列に保存されます。
for( CIFaceFeature *face in features ) {
face.bounds;    // 顔の座標とサイズ
face.leftEyeClosed;    //左目が閉じているか
face.rightEyeClosed;  //右目が閉じているか
face.leftEyePosition;   //左目座標
face.rightEyePosition;//右目座標
 }
このように顔の他、両目の位置やこの他に口の位置も取得できます。
ただ簡単に顔の認識は可能ですが、識別のレベルはまだないようで今後の進化に期待ですね。
担当:M.Y
0 notes
inner-impl · 12 years ago
Text
文章改行
 飛び膝蹴りの着地に失敗し、右足の靭帯を損傷してしまい、全治1か月と診断された今日この頃、みなさまいかがお過ごしでしょうか? 今回はアンドロイドで文章を使うさいの改行のお話。
筆者がアプリ内に説明文を入れていると、レイアウト画面ではちゃんと説明文が表示されるのに、実機でテストすると二行目までしか表示されず末尾に「…」と省略する記号がつけられていた。
説明文なので全文が読めないと意味がないので、何とかしてやらなければならない。
調べると、
ellipsize
こいつが原因のようで
none何もしない
startテキスト冒頭で "…"
middleテキスト中盤で "…"
endテキスト末尾で "…"
margueeスクロールする
といった物を見つけた。
今回は全文を表示したいので、
android:ellipsize="none"
としてやり、解決することが出来た。
執筆者 ちびた
0 notes
inner-impl · 12 years ago
Text
【iOSアプリ開発】Ad Hoc 配布方法メモ
みなさんこんにちは、お元気にお過ごしでしょうか?
先日初めて、Ad Hocインストールを行いました。
そう頻繁に最初の準備から行うことはないとはないと思うので、忘れないように簡単にメモします。
メモ回です。
まず前提条件として、Apple Developer Programに開発者登録をしている必要があります。
これはまあ大丈夫かと思います。
次に、配布先端末のUDIDをAppleに登録しプロビジョニングファイルを作成、Xcodeに登録します。
1.端末のUDIDを取得します。
iTunesもしくはアプリから取得することができるのですが、一部iOS7端末がアプリから正常にUDIDを取得できないので、iTunesから取得するのが良いでしょう。
PCに端末を接続した状態でiTunesを起動し、端末情報画面「シリアル番号」をクリックするとUDIDが表示されます。
※私はアプリから取得を試みてハマりました(汗
2.先ほどのApple Developer Program サイトにログインします。
3.「iOS Dev Center」->「Certificates,Identifiers & …」-> 「Devices」と進みます。
4.右上[ + ]ボタンを選択し、デバイス登録名とUDIDを入力し「Continue」ボタンで登録します。
5.プロビジョニングファイルを作成し登録します。
デバイス登録が完了すると上記3を実行後の画面に戻りますので「Distribution」を選択します。
右上[ + ]ボタン選択 -> Ad Hoc選択 -> 「Continue」
Ad Hoc配布するAppIDを選択 -> 「Continue」
使用するcertificates選択 -> 「Continue」
配布device選択 -> 上記4で登録した登録名が表示されているので選択 -> 「Continue」
プロファイル名を入力し「Generate」
と進むと「Download」ボタンが表示されるので、選択しダウンロードします。
ダウンロード完了後、プロビジョニングプロファイルをダブルクリックすると登録されます。
※画面に変化はありません。無闇に何度もクリックすると正常に登録されない可能性もあるのでやめましょう。次手順で登録されているか確認できます。
次に、配布するアプリデータ(.ipa)を作成します。
1.Xcodeのプロジェクト画面 Target -> BuildSettings -> Code Signing で、先ほど登録したプロビジョニングプロファイル名が表示されるので選択します。
2.Xcodeメニューの「Product」->「Archive」と選択します。
3.正常に完了すると「Organizer」が自動的に表示されます。
4.Organizer画面で「Distribute」-> 「Save for Enterprise …」選択、「Next」ボタン -> プロビジョニングプロファイル選択 -> 「Export」ボタンと進みます。
5.「Save for Enterprise Distribution」にチェックを入れ、.ipa名とダウンロード先を選択し、「Application URL」に公開するWebのURLを入力、「Save」ボタンで.ipaファイルと.plistが作成されます。
最後に、作成された.ipaファイルと.plistファイルをアップロードし、ダウンロード用リンクを.plistを指定するように作成することで完了です。
簡単に書いたつもりが意外に長くなりましたね(笑)
以上がAd Hoc 配布方法でした。
担当:Y.M
0 notes
inner-impl · 12 years ago
Text
【iOSアプリ開発】警告 Attribute Unavailable
みなさんこんにちは、お元気にお過ごしでしょうか?
プログラミングでは、コンパイルが通るからと言って警告を放置せず極力潰す、当たり前かと思います。
エラーになっていないだけで不具合になっているかも知れませんし、今後不具合になる可能性もあるからです。
私の場合は、エラーが表示されていると落ち着かないと言う点が大方の理由を占めているような気がします(笑)
さてそんな警告ですが今回はタイトルにあるAttribute Unavailableを取り上げたいと思います。
というのも、最近(?)xcodeの5.0、iOS SDK 7.0がでてきました。
今ではどうってこともないのですが、自分の既存プロジェクト(xcode4.6 iOS SDK6.0)で試してみた際に、一番ハマってしまったからです(^^;
まず表示された警告はこちら
Attribute Unavailable
Restoration identifier is not available on iOS versions prior to 6.0
英語が苦手なんで意味はよくわかりませんが、とりあえずバージョンが違うんだな!ということは何となくわかりました。
ということで、各xibとstoryboardのバージョンを確認しました。
Tumblr media
   Opens in (xcodeのバージョン)
 Builds for (プロジェクトが対象とする一番古いiOSバージョン)
 View as (どのiOSバージョンで表示するか)
 しかし、こちらでは改善されませんでした(そもそもxcode5.0で対象バージョンにもおかしなところはなかったです)
さっぱりわからなくなり調べたところ
Tumblr media
こちらのDefines Contextはチェックを外さなければならないというものを見つけました。
しかし、こちらも元から全てチェックが外れておりました。
警告をクリックすると、原因であるxibもしくはstoryboard上のviewがフォーカスされるのですが、如何せんどこが原因なのかわからなかったんです。
そして最後、こちらで解決しました。
Tumblr media
  Restoration ID こちらを空白にしなければならないそうです。
解決してしまえばたいしたことのない話で、確かに善く善く見てみると、確かに Restoration identitier と警告に表示されてますし、最初のバージョン確認の警告は
Attribute Unavailable
Custom Identifiers in Interface Builder versions prior to 3.2
でした。
 xcode4 から 5 へ変更された際にこの警告で困りましたら、まずRestoration IDを確認してみては如何でしょう?(笑)
担当:Y.M
0 notes
inner-impl · 12 years ago
Text
スマホっぽく
凱旋門賞でオルフェーブルが負けて一週間、オルフェで勝てないなら当分は無理だと思う今日この頃、皆さんはいかがお考えでしょうか?
今回の題材はスマホです。
先��えらいさんに「スマホっぽいデザインに!」と言われ困ってしまいました。
スマホっぽくってなんやねん・・・。
まずは、画面の違いでしょうか、PCは横に長いですが、携帯は縦に長い。
次にボタンなどの違いですか、アプリなどで使われているボタンと、PCサイトのボタンはデザインが違いますよね。
後はその時の流行などで変わってくるのではないかと思われます。(新しく出たスマホという分野がPCとの違いをつけるためにデザインなどを変えていて、それが主流になっていくと、そのうちPCも同じような感じになっていくのかなとも思っています。)
自分が作った物を主流にしたいのはわかるけど、PCかスマホか変わるたびに考え方を変えなくてはならないのはね・・・、と愚痴を言っても始まらないので、いろいろ見て参考にしていくしかないですね。
ちなみに脳内ペットに「スマホっぽくってどういうこと?」と尋ねました。
Tumblr media
答えは
Tumblr media
こういうことらしいです。
執筆者 ちびた
0 notes
inner-impl · 12 years ago
Text
【iOSアプリ開発】自作クラスでDelegate
  みなさんこんにちは
 お元気にお過ごしでしょうか?
 本日は自身で定義したクラスにDelegateを実装する方法について、前回のプロトコルの続きのようなお話になります。
 用意としては下記3点の準備が必要になります。()内は今回例として使う各名称です。
 1.Delegateプロトコルの宣言(SampleDelegate)
 2.Delegate元のクラス(SampleClass)
 3.Delegate先のクラス(SampleController)
 順番は自由なのですが、それでは1から順番に準備をしていきましょう。
 Delegateプロトコル宣言ですが、これは以前にお話した内容ですね。
 @protocol SampleDelegate : NSObject
 // ここにSampleControllerで実装が必要なメソッドを宣言
 - (void)sampleMethod;
 @end
 次に2のDelegate元のクラスです。
 Delegate先を参照するプロパティを定義します。
 以下の例で言うとDelegateには、<>内で指定したSampleDelegateを採用しているクラスが設定できるようになります。
 @interface SampleClass : NSObject
 // Delegate先を参照するためのプロパティ
 @property (nonatomic, assign) id<SampleDelegate> delegate;
 // 任意のメソッド
 - (void)testMethod;
 @end
 @implementation SampleClass
 - (void)testMethod
 {
    // Delegate先がsampleMethodを実装しているか確認
    if( [self.delegate respondsToSelector:@selector(sampleMethod)] )
        [self.delegate sampleMethod];
 }
 @end
 最後に3のDelegate元のクラスでプロトコルを採用し、必須メソッドを実装します。
 また、初期化時にDelegateを設定することも忘れないように。
 @interface SampleController : UIViewController <SampleDelegate>
 @end
 @implementation SampleController
 - (void)viewDidLoad
 {
    [super viewDidLoad];
    SampleClass *sample = [[SampleClass alloc] init];
    sample.delegate = self;
    [sample testMethod];
 }
 - (void)sampleMethod
 {
    // Delegateメソッド
 }
 @end
 以上でDelegateの実装となり、上の例ですとtestMethodが呼ばれるとDelegateメソッドのsampleMethodも呼ばれるようになります。
 少しやることが多いですが、使えると面白いぐらい便利です(笑
 担当:Y.M
0 notes
inner-impl · 12 years ago
Text
いろいろな色
今日の朝、出勤中に偶然友達に会って、焼肉の食べ放題に誘われました。まだ先なのですが、いまからそれが待ちどうしい今日この頃、肉は心の栄養素、みなさま肉を食べておりますか?
さて今日は色に関してです。
Webサイトを作っていく上で避けては通れない色彩ですが、これがすごく難しく感じます。
自分は使う色が少ないほうが好きなのですが、そうすると必ず黒と白のどちらかは入ってきます。確かにシンプルで見やすい気がするのですが、他の人に地味すぎないかとか目立たせたいところが目立たない、とツッコまれると、そうも見えてくる。
作っている間になかなか、何が良いのかわからなくなってきます。
少し暗くしてみたり、少し明るくしてみたりするともうどっちがどうなんだかと思う時が良くあります。そんな時はとりあえず周りに意見を求めていったん頭のリセットを行います。
やっぱり人の意見は大事ですよね。
確かに横に並ぶと不快な感じがする配色もあるんでしょうが、どう考えても人の好き好きが出てしまうと思います。なので、セオリー通りでも通らないことがあるんだと思います。まるで中高で勉強した国語みたいですね。書いた人の考えではなく出題者がどう考えているか読み取れみたいな。
tumblr.はほぼ二色なのに見た目がカッコいいですよね、レイアウトがそう見せているのでしょうか?
こんな感じで作っていけるように今後努力しようかと思います。
執筆者 ちびた
0 notes