RSS
1

iOS: delegateを自作クラスに実装する

UITableViewDelegateなどのデリゲートを自作クラスに実装する方法です.デリゲートを自作できると好きなタイミングで処理やデータの受け渡しが簡単にできるので,覚えておくべき手法の一つです.

(例)カウントダウンする自作クラス MyTimer にて,以下の自作デリゲードを実装してカウントダウン中に他クラスから自身を制御できるようにする.

    (a) カウントダウン中に逐次呼ばれる ( didMyTimerCounted: )
    (b) カウントダウンが終わったときによばれる ( didMyTimerFinished: )

      自作クラスのヘッダーにて,protocolを用いてデリゲート名 MyTimerDelegate および,必要なメソッドを宣言して,interfaceにて自デリゲートを持つidを追加する.
      [MyTimer.h]

      #import < foundation / foundation.h >
      @class MyTimer;

      @protocol MyTimerDelegate

      @optional // オプション
      -(void)didMyTimerCounted:(MyTimer *)myTimer;

      @required // 必須
      -(void)didMyTimerFinished:(MyTimer *)myTimer;

      @end

      @interface MyTimer : NSObject
      @property NSInteger counter;
      @property id < MyTimerDelegate > delegate;
      -(void)countDown:(NSInteger)time;
      @end
      つぎに,メソッドファイルにて,そのデリゲートを好きなタイミングで呼び出す.
      [MyTimer.m]

      #import "MyTimer.h"

      @implementation MyTimer

      -(void)countDown:(NSInteger)time
      {
          self.counter = time;
          do{
              self.counter--;
              [self.delegate didMyTimerCounted:self];
          }while ( self.counter > 0 );
        
          [self.delegate didMyTimerFinished:self];
      }

      @end
      自作デリゲートの実装のこれで終わり.ほかのデリゲートと同様に使えばOK.
      [MEViewController.h]

      #import < UIKit / UIKit.h >
      #import "MyTimer.h"

      @interface MEViewController : UIViewController < MyTimerDelegate >
      {
          MyTimer *myTimer_;
      }
      @end

      デリゲートの各メソッドを書いていく
      [MEViewController.m]

      #import "MEViewController.h"

      @implementation MEViewController

      - (void)viewDidLoad
      {
          [super viewDidLoad];   
          myTimer_ = [[MyTimer alloc] init];
          myTimer_.delegate = self;
          [myTimer_ countDown:20];
      }
      -(void)dealloc
      {
          myTimer_.delegate = nil;
      }

      -(void)didMyTimerCounted:(MyTimer *)myTimer
      {
          NSLog(@"%s", __func__);
          NSLog(@"counter = %d", myTimer.counter);
      }
      -(void)didMyTimerFinished:(MyTimer *)myTimer
      {
          NSLog(@"%s", __func__);
          NSLog(@"counter = %d", myTimer.counter);
      }

      @end

      このサンプルコードです.ライセンスは使った分・得した分だけ,知り合いに飯を奢ること.

      Read more
      0

      私信

      「連射 アンドロイド カメラ 実装 takepicture」で定期的に来られるアカデミック関係者の方がいらっしゃるのですが,何用ですか.すごく気になるのですが・・・
      Read more
      0

      au iPhoneに来たEZホットインフォを解約する

      つい先日,迷惑メール同等と名高いEZホットインフォがうちのiPhoneにも届いた.MNPでauに戻ってきて二ヶ月,今まで来てなかったので来ないものだと思っていたのに.GREEのゲームなんかしない,むしろ虫ずが走るので一刻も止めたい.ネットを見ていると,解約は157へ電話してとがあるが,今月?ぐらいからネットからでも解約できるようになった.相手がauとはいえ暗証番号を口頭で伝えるのは違和感を感じるので,後者で解約してみた.

      au oneにログインして解約(メルマガの停止)するのだが,そのアカウントとiPhoneを連携しないといけない.しかし,今の仕様では既存アカウントにiPhoneを連携させる方法がない.じゃあ,どうすれば?というと,iPhoneから新規アカウントを申請するしかない(自動で新規アカウントにiPhoneが結びつけられる).au oneメールを使う予定がないので完全に捨てアカだ.新規登録後はメール後半にある解約のリンクを辿っていけば無事に停止できる.電話をした方が簡単だったかも.

      なんでこんなキモち悪い仕様なのかと気になったけど,上記の解約ページのURLにmedibaの文字が.あー,あのミログを利用してAppLogで個人情報をブチ抜いてたmedibaさんじゃないですか!.ということで,EZホットインフォがそのmediba絡みなら,そのユーザーへの嫌がらせも納得ですよ.
      Read more
      1

      iOS: 縦書きアプリの進捗

      なんちゃってワープロになる予定の次期,縦書きアプリ(開発中)のスクショ.


      Read more
      0

      iOS: キーボードの言語を調べる方法

      iOSアプリのキーボードで今使っている言語(フルキーボード,フリックや数字などの種類ではなく日本語や英語などの言語)を見分ける関数を作った(まあ,種類もその方法で一緒にわかるけど).まだ,それを組み込んだアプリ開発の時間がかかりそうなので非公開(そのアプリがリリースできたら公開予定).もし,その判別方法を一刻も知りたい人で,実際に組み込んでその判定に関するアップルの審査結果を教えてくれる,かつ,これが原因でリジェクトされても怒らない人がいたら,連絡を.
      Read more
      0

      NSErrorの覚え書き

      NSErrorを使ったメソッドのエラー処理についての覚え書き.エラーを受け取る必要がないときは,下記の例だと,[self hogehoge:nil]にする.

      @interface MyViewController : UIViewController
      -(BOOL)hogehoge:(NSError **)error;
      @end

      @implementation MyViewController

       -(BOOL)hogehoge:(NSError **)error
      {
          if( 問題が起こったとき )
          {
              if( error )
              {
                  NSMutableDictionary* errDetails = [NSMutableDictionary dictionary];
                  [errDetails setValue:@"エラーの原因など" forKey:NSLocalizedDescriptionKey];
                  *error = [NSError errorWithDomain:@"world" code:200 userInfo:errDetails];
              }
              return NO;
          }
          return YES;
      }

      -(void)main
      {
          NSError *err = nil;
          if ( [self hogehoge:&err] == NO)
          {
              NSLog(@"%@", [err localizedDescription]);
          }
      }

      @end
      Read more
      0

      Firefoxの脱Googleツールバーに向けて

      今朝,だましだまし使っていたFirefox 6.0のGoogleツールバーからログインが出来なくなっているのに気付いたので,脱ツールバーを計ることに.Chromeを使えばいいじゃんともあるけど,なかなか他のアドオンの代わりが見つからないため,逆にGoogleツールバーをリプレイスしてみた.今回の目的は,簡単なGoogleブックマークの管理とGmailなどへの簡単なアクセスを別のアドオンで代用したい.

      Deng Google Bookmarks
      Googleブックマーク管理のアドオン.他にGmarksなるアドオンを入れてみたけど,ツールバーの操作性には及ばない.そして,やっと見つけたのが,Deng Google Bookmarks.UIがほぼツールバー,むしろツールバーと言わんばかりの類似.ブックマークの追加等も簡単に行えるのが素晴らしいよ!

      Google Shortcuts - All Google Services at a glance
      Googleの各種サービスのショートカットを追加するアドオン.単にGmailとGoogle Calendarにワンクリックでアクセスしたいためのショートカットボタンなので,とくに特化した機能はないけど,それらを多用する身なのでこれは便利(Bookmarksへのショートカットも追加できるけどwebにつながるだけなので,ツールバーのようにはつかえない).

      この2つの アドオンで,必須機能は補間できたので脱Googleツールバーは成功.あとは,検索ワードのページ内検索機能が欲しいところ.


      でも,一番欲しいのはFirefoxアドオンの自動同期.今まで一つのアドオンで済んでいたのを複数のアドオンで補間するので,新規設定すると面倒きわまりないよ.
      Read more