2012年1月31日火曜日

テーブルの編集1

テーブルを制するものはアプリを制する
なんて言葉があってもおかしくないほど頻繁に利用するのがテーブル。

テーブルの扱いでインターフェースの善し悪しが決まってしまうのは、androidでもiphoneでも、WEBアプリでも同じです。

というわけで、ここではiphone開発のテーブル処理を記述していきます。

まずは、UINavigationItemに編集ボタンを追加する方法


- (void)viewDidLoad {
    NSLog(@"%s", __func__);
    self.navigationItem.rightBarButtonItem = [self editButtonItem];
}

上記の記述をすると、ナビゲーションの右側に編集ボタンが設置されます。

設置された編集ボタンを押下すると、以下のメソッドが呼び出されます。

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    NSLog(@"%s", __func__);
    [super setEditing:editing animated:animated];
}

編集ボタン押下後に、デフォルト動作以外でインターフェースを変更したい場合はここに処理を記述します。

編集ボタンを押下すると、削除ボタンが表示されます。その削除ボタンを押下すると、以下のメソッドが呼び出されます。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
                                            forRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"%s", __func__);
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // NSLog(@"before count is %d", [self.list count]);
        NSInteger row = [indexPath row];

       // この処理を実行すると、tableView:numberOfRowsInSectionが呼び出される
       [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
                        withRowAnimation:UITableViewRowAnimationFade];
    }
}

削除処理の場合は、引数editingStyleにUITableViewCellEditingStyleDeleteの値が格納されます。

deleteRowsAtIndexPathsメソッドはテーブルの削除処理と表示をおこないます。

また追加の場合は

        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:insertIndexPath_] 
                              withRowAnimation:UITableViewRowAnimationFade];

の処理を記述します。

列の追加と削除はアニメーションを使って、ユーザーが目で確認できるようにするべきです。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年1月30日月曜日

エンジニアが新しい言語を学ぶ方法

久しぶりの雑談です。
さてさて、エンジニアとして開発をおこなっていると直面してくる問題の一つに、
新しい言語をいつ、どのように覚えるかということがあります。

この世界はスピードが速いので、トレンドはすぐに変わります。
私の場合、現在はjava,objective-C,HTML5をメインで使っています。
以前はサーバーサイドのjava,php,ruby等でもちょこちょこと開発しましたが、今は全く利用していません。
サーバー側はpythonでちょこちょこ書くくらいです。

今後しばらくは続くであろうiphoneとandroidの共存時代は、
おそらく共通部分をjavaScript、HTML5、csss3で組み込みつつ、java,objective-Cを使って
細かい部分を補っていくという手法がメインになるでしょう。

iphone, android, windows phone, nokia等の様々なスマートフォンのアプリ開発を
HTML5とjavaScriptだけ全ておこなえるツールが色々開発されていますが、あまり使うのはおすすめできません。
急がば回れとはよくいったもので、結局高い代償を払うことになると思います。

さて、そうすると当然勉強が必要になります。
我々エンジニアはどう勉強していけば良いのでしょうか。

もっとも効果的な勉強方法はただ一つです。
それは製品(アプリ)を「作る」ことです。

プログラミングを技術を最大に向上させる手段は、やはりアプリケーションをつくることです。
そして、つくったアプリはリリースしてください。そして、保守を続けてください。
この手順を一人の力だけで繰り返してください。
プログラマー、エンジニア、そして製品管理の力が大きく向上するはずです。

一年〜二年の期間ごとに、新しい言語で新しいアプリを作成することは、時間的にも無理なく実力をつけることができると思います。
もちろんその間も基礎の勉強は継続して欲しいのですが、無理することもないでしょう。
それなりの基礎力は物をつくっていく中で身に付きます。

5年以上一つの言語でしか物を作っていないという人は注意してください。
ゆでがえる状態にあると思って間違いないです。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年1月29日日曜日

iphoneアプリ設計の極意

今日は久しぶりにお薦めの開発本を紹介します。

これはスマートフォンアプリの設計や開発をするなら絶対に読んでおきたい本です。
私もアプリの設計で迷った時は、この本に目を通すようにしています。 私の本は、付箋とアンダーラインだらけです。
スマートフォンアプリで最も大切なのが、操作性とUIデザインです。そしてなにより標準性です。
この本を読めば、あなたは良いスマートフォンアプリのデザインを学ぶことが出来るでしょう。 android,iphone,windows phoneの開発者、全員に読んでもらいたい本です。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年1月28日土曜日

プロトコルを理解する2

プロトコルを理解する1でプロトコルの概念は理解できたはずなので、ここから先は実装を行います。
まず、プロトコルLessonを作成します。

@protocol Lesson
- (NSString *)getLessonContent:(int)lesson;
@end

次に上記で作成したプロトコルを実装します。

#import "Lesson.h"

@interface ObjectiveCStudyViewController : UIViewController<Lesson> {
 @private 
  UILabel *stateText;
}
@property (nonatomic, retain) IBOutlet UILabel *statusText;
@end

@implementation ObjectiveCStudyViewController
@synthesize statusText;

- (NSString *)getLessonContent:(int)lesson {
    NSString *lessonNumber = [NSString stringWithFormat:@"%d", lesson];
    NSString *returnLessonContent = [@"lesson" stringByAppendingString:lessonNumber];
    return returnLessonContent;
}

@end

メソッドは実装部のみに記述します。
ではコンパイルして実行してみましょう。

NSLog(@"getLessonContent is %@", [self getLessonContent:3]);

以下の結果が出力されます。

   getLessonContent is lesson3

きちんとメソッドが実行できたのが確認できますね。

このプロトコルは、iphoneアプリの開発で、UINavigationControllerを使った パラメーターのやり取りで使用すると便利です。
呼び出し側でdelegateをセットして、呼び出し側からプロトコルを呼び出すというパターンです。
これも後々説明します。
とりあえず、iphone開発をするなら、プロトコルの使い方は覚えておくと便利だと思います。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年1月27日金曜日

プロトコルを理解する1 objective-c

  • 公開日:2012年01月17日
  • 最終更新日:2015年5月17日

環境

  • Xcode6.1

プロトコルとは

objective-Cにはプロトコルという概念があります。
プロトコルは、オブジェクトの役割や振る舞いをあらわすメソッドの集合のことです。
ちなみに、java言語におけるインターフェースという概念は、objective-Cのプロトコルを取り入れています。

プロトコルの宣言

プロトコルは、メソッド宣言の集合であり、実現方法は各クラスに任されます。
以下のように宣言します。

    @protocol プロトコル名
    メソッド宣言;
    @end

xcode6.xでプロトコルファイルを作成する場合は、
追加→iOS→Source→新規ファイル→Objective-C File→ファイル名入力,Fileの種類でProtocolを選択
といった手順になります。

上記の構文を使ってサンプルのプロトコルを実装してみます。

// ファイル名:Lesson.h
@protocol Lesson
- (void)attend;
- (void)absent;
@end

プロトコルファイルは通常ヘッダファイル(xxxxx.h)として記述します。
また、プロトコルを利用する場合は、必要とするクラス宣言でインポートします。
プロトコルの利用はインターフェースで以下のように宣言します。

    @interface クラス名 : スーパークラス名 <プロトコル名> {
      インスタンス変数;
    }
    メソッドの宣言:
    @end

プロトコルの宣言をした場合、インターフェースで宣言したメソッドと同様に、実装部で実装する必要があります。

上記の構文を使って実装してみます。プロトコルは、先ほど作成したLessonプロトコルを使用します。

#import "Lesson.h"

@interface ViewController : UIViewController <Lesson>{
    
}

@end

上記のように宣言すると、プロトコルに含まれているメソッドはクラスの宣言の一部として記述されたのと同じことになります。そのため、クラスのインターフェース(xxxx.h)でメソッドを改めて記述する必要はありません。

複数プロトコルの宣言

又、プロトコルは複数指定することも可能です。インターフェースの<>内で【,】で区切って複数のプロトコル名を記述します。

    @interface クラス名 : スーパークラス名 <プロトコル名1, プロトコル名2> {
      インスタンス変数;
    }
    メソッドの宣言:
    @end

複数のプロトコルに同じメソッド宣言が重複して含まれていても問題ありません。
また、カテゴリに対してもプロトコルを採用することを宣言できます。

プロトコルの継承

プロトコルは継承も可能です。

プロトコルの意義は、プロトコルを採用したクラスがどういう機能に対応しているかを明確にすることです。クラスがどのプロトコルを採用しているかを知るには、Class ReferenceのConforms toグループで確認できます。
例えば、NSStringクラスならば、

  • NSCoding
  • NSCopying
  • NSMutableCopying
  • NSObject (NSObject)
のプロトコルに対応していることになります。

長くなったので、その2へ続きます。

objective-cの名著の紹介

Objective-cをしっかりと理解したいしたいなら、詳細objective-cがオススメです。
読むたびに理解が深まる良書です。なるべく手元置いておきたい一冊です。

参考

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年1月26日木曜日

型のある定数を宣言する

objective-Cで型を宣言した定数を利用したい場合があると思います。
その場合は、constを利用します。

@implementation TestController 

const NSInteger SAMPLE_TEXT_FIELD_TAG = 2;

@synthesize testId = testId_;
@synthesize testName = testName_;

- (IBAction)cancel:(id)sender {
    NSLog(@"%s", __func__);
    [self dismissModalViewControllerAnimated:YES];
}

@end

objective-Cの定数宣言は、他にもdefine,enum等で可能です。
共通で利用する定数を宣言するの記事で紹介したような手法も利用できます。

何がベストプラックティスなのかは、私はobjective-Cの経験値が低いので断言できません。
もっと突っ込んで知りたい人はこちらの記事が参考になると思います。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年1月23日月曜日

iphone開発の基礎知識 カテゴリを理解する

objective-Cにはカテゴリという概念があります。カテゴリは、あるクラスの一部分のメソッドを実現するモジュールです。
カテゴリはクラスと同様にインターフェース部分で宣言を記述し、実装部にその定義を記述します。ただし、インスタンス変数を宣言することはできません。

カテゴリは以下のように宣言します。

    @interface クラス名 (カテゴリ名)
    メソッド宣言;
    @end

実装部は、以下のように記述します。

    @implementation クラス名 (カテゴリ名)
    メソッド宣言;
    @end
カテゴリの利用で多いケースは、既存のクラスに新しいメソッドを付け加える場合です。
新しいインスタンス変数の追加はできませんが、新しく追加したメソッド定義から既存のインスタンス変数やメソッドにはアクセス可能です。

以下にサンプルのコードを記述します。

#import <Foundation/NSString.h>

@interface NSString (Hiroshimaben) 

- (NSString *)stringByAppendingHiroshimaben:(NSString *)str;

@end

上記のサンプルは、NSStringクラスにstringByAppendingHiroshimabenメソッドを宣言しています。このメソッドは、受け取った引数の文字列に「jyaken-no」という文字列を追加して返すようにします。
次に実装部です。

#import "NSString+Hiroshimaben.h"

@implementation NSString (Hiroshimaben)

- (NSString *)stringByAppendingHiroshimaben:(NSString *)str {
    NSString* returnStr = [str stringByAppendingString:@"jyaken-no"];
    return returnStr;
}

@end

実装部はヘッダーファイルのimportが必要です。ファイル名は「クラス名+カテゴリ名」とするのが良いとされています。
さて、では上記のファイルをコンパイルして実行してみましょう。

    NSString *str = @"test";
    NSLog(@"str is : %@", [str stringByAppendingHiroshimaben:str]);

以下の結果が出力されます。

    str is : testjyaken-no

文字列に「jyaken-no」が追加されているのが確認できますね。

カテゴリは、既存のメソッドで定義されているメソッドも上書き可能です。
しかし、上書きする場合は、十分な注意が必要です。見かけ上は単純なメソッドでも、プログラム内で様々な目的で使われている場合があります。そのようなメソッドを置き換えた場合。プログラムが正しく動作しなくなります。
なので、カテゴリを用いて既存のメソッドを置き換えるのはあまりおすすめできません。サブクラスでおこなったほうが安全です。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年1月21日土曜日

2022—これから10年、活躍できる人の条件 感想

 とても楽しみにしていた本で、発売日に購入しました。
一言で内容をまとめると、
「歴史は繰り返す。そのために過去から学んで先の時代に準備してください」
といった内容です。



これは現在アメリカの投資家の間で言われていることと全く同じです。
今後10年で大きく社会が変容するのは間違いないでしょう。
今はソーシャルメディアの発達で誰でもメディアを持つことが出来、誰でも世界中に自己を発信できます。
なので、これまでの社会と同じ状態が続くことはありえません。

特に最近のIT関連技術の発達速度は異常です。
android,iphone,WEBアプリの開発者である私がついていくので精一杯なのだから、
他の職種に携わっているかたはソーシャルメディアの可能性はいまいち理解しにくいでしょうし、未来予測は相当難しいでしょう。

だから一つだけ覚えておいてください。
「徹底的に自分らしさを磨きあげましょう。そして、メディアをとおして自己発信を続けましょう」

自分のやりたいことをやりましょう。そして、blogなり、faceBookなり、youtube, ustreamなりで
自分の意見を発信してください。そして、継続してください。

そして発信した物に対するレスポンスを大切にしてください。
レスポンスの中には、多くのヒントがたくさん隠されています。
そして、客観的になって自分を見てみてください。
きっと、あなたが取るべき道が見えてくるはずです。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年1月20日金曜日

unrecognized selector sent to instance

iphoneアプリの開発で、unrecognized selector sent to instanceエラーが発生するケースがあります。
多くの場合、オブジェクトの過度なreleaseが原因です。
というわけで、以下に気をつけるパターンを示します。

リストデータのオブジェクトの開放

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"%s", __func__);
    
    NSInteger row = [indexPath row];
    MemoryModel* obj = [self.list objectAtIndex:row];
    MemoryDetailViewController* controller = [[MemoryDetailViewController alloc] initWithStyle:UITableViewStyleGrouped];
    controller.memoryModel = obj;
    
    [obj release], obj = nil;
    
    [self.navigationController pushViewController:controller animated:YES];
    
    [controller release], controller = nil;
}

上記のコードでは、インスタンス変数に格納したリストオブジェクト中からモデルデータを取り出し、詳細データ画面遷移後に開放する前にオブジェクトを開放しています。
このようなケースでオブジェクトを開放してしまうと、navigationで戻ってもう一度同じ列を選択すると、エラーが発生します。


    //  [obj release], obj = nil;

上記のようなリストから詳細画面への遷移は、オブジェクトを開放しないようにするのが正解です。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年1月15日日曜日

共通で利用する定数を宣言する

iphoneアプリの開発では、多くのクラスで共通利用したい定数があると思います。
その場合は、Other Sourcesフォルダ以下にあるPUROJECTNAME_Prefix.pchファイルに定数を記述すると良いです。このファイルに記述した定数は、#import宣言しなくても利用できます。

#ifdef __OBJC__
    #import 
    #import 

#define CONTROLLER_VIEW_TITLE @"サンプルコントローラー" // サンプルコントローラータイトル
#endif

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年1月14日土曜日

日付形式を指定して現在日付を取得する

iphoneアプリの開発では、sqlite3をデータベースとして利用することが多いと思います。
sqlite3にはMysqlのような日付型は存在しません。その代わりに、日付形式の文字列をTime Stringとして扱います。もっとも汎用的な日付形式は【yyyy-MM-dd HH:mm:ss】です。sqlでorder byをするときに楽です。

アプリで特定の操作を行ったあと、テーブルに登録日付や更新日付を格納するのはよくあるパターンです。
ということで、objective-Cを使ってsqlite3に格納できる現在日付の取得方法が以下になります。

    NSDate* date = [NSDate date];
    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

    NSString* sqlite3InsertCurrentDate = [dateFormatter stringFromDate:date];

    [dateFormatter release];

    return sqlite3InsertCurrentDate;

クラスメソッドとして使うと便利です。海外対応しているアプリの場合は、以上のコードでlocalも指定するとさらに良いと思います。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年1月12日木曜日

今年の目標

さて、今年も約2週間が経過しました。
というわけで今年の目標設定です。

1、iphone,ipadの開発に力を入れる

ここ一年半くらいはずっとandroidアプリの開発ばかりなので、そろそろこちらも力をいれていこうと考えています。 書籍や情報も多く、色々なアプリに取り組みやすいのも利点ですね。

2、グラフィックの勉強

アプリやHP等を作成するときに、いつも力量不足で困っているので、基礎から本格的に勉強していこうと思っています。 現在は、inkscpaeのチュートリアル始めました。

3、基礎の強化

ここ数年の課題です。 リーマン時代の仕事を含めるとここ一年半で作ったアプリは20近いのですが、そのたびに基礎をもっと強化しないと いけないと強く感じていました。 現在「コンピューターの構成と設計」の第4版の勉強中です。 たくさんの本を読むより、良い本を繰り返し繰り返しやっていきたいと思います。 年間で2,3冊こなせたらいいなと思っています。

4、ブログの定期的な更新

いつもまとめて更新しがちになるので、ことしはなるべく定期的に更新したいです。

以上です。 今年もよろしくおねがいします。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年1月7日土曜日

androidアプリの動画を撮影してマーケットで公開する

アンドロイドマーケットに開発したアプリをリリースするとき、youtubeで動画を指定することができます。 これは、マーケティングとして是非やっておきたい作業です。
それにはまず、アプリの動画を録画しないといけません。
その場合に利用するのが、Android Screencastです。
ビデオカメラで撮影すると、指まで撮影されてしまいますが、Android Screencastなら その心配はありません。
詳細な説明は以下のサイトに記述されています。

Android Screencast

アプリ動画の録画にはAndroid SDKが必要です。しかし、開発者なら導入済みのはずなので問題ないと思います。
録画方法は、USBに端末を繋ぎ、DDMを起動してから4.のclick hereをクリックすればOKです。

録画が終了したら、youtubeに動画をアップロードして、アンドロイドマーケットにURLを設定します。

下記の動画は、先日にリリースしたアプリの動画です。androidマーケットにはこの動画が指定してあります。

androidアプリHTML5紹介動画

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

新作androidアプリをリリース

新作のandroidアプリをリリースしました。 HTML5というアプリです。
「HTML5」アプリは、これからHTML5を勉強しようと考えている人、 もしくは現在勉強している人が利用することを想定して作成したアプリです。
「HTML5」アプリを使えば、HTML5の基本から応用までを難易度別に勉強することができます。
これまでに一度もHTMLプログラミングをしたことのない人は、最初はちょっと難しく感じるかもしれません。
しかし、この「HTML5」アプリを繰り返し使っているうちに、HTML5を使った基本的なWEBページが作れるようになると思います。
隙間時間に利用できるアプリなので、電車の待ち時間、暇つぶしなどでも利用してみてください。いつのまにか基礎力が向上しているはずです。
また、このアプリではゲーム要素をたくさん詰め込んでみました。なので、楽しく勉強できると思います。
今後もバージョンアップで多くのゲーム要素やHTML5についてのコンテンツを追加していくつもりです。
楽しくHTML5の勉強を続けてみてください。
この情報化時代で生活していくうえで、とても役に立つスキルになるはずです。
以下のQRコードからアプリのダウンロード画面に直接遷移できます。
android version2.1以上で動作します。

アプリ画像

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加
Related Posts Plugin for WordPress, Blogger...