2010年5月1日土曜日

ドット演算子使用時のid型のキャスト

ドット演算子を使用する場合、明示的に型を指定しないと(id型の場合)、ドット演算子が使えないそうです。そのため、id型で取得するsenderの利用は、特定の型のインスタンスに代入してからドット演算子を使うことになるようです。

-(IBAction)sliderChange:(id)sender{
   UISlider `slider =(UISlider *)sender;
   int a = (int)(slider.value +0.5f);
}

でも、これじゃだめなんでしょうか?
-(IBAction)sliderCahnge:(UISlider*)sender{
  int a = (int) (sender.value +0.5f);
}

実行してみるとできました。たぶんいいのでしょう。こちらのほうが明示的かつ簡潔的で好みです。

UIResponder(イベントの管理応答)

UIVeiwクラスやその派生クラスは、UIResponderを継承しており、以下の機能も保有しています。

レスポンダーチェーンを管理する
resignFirstResponderでは、当該オブジェクトをFirstResponder(ユーザ使用中)から解除することで、キーボードを非表示にできます。
  • – nextResponder
  • – isFirstResponder
  • – canBecomeFirstResponder
  • – becomeFirstResponder
  • – canResignFirstResponder
  • – resignFirstResponder
入力ビューを管理する
  •   inputView  property
  •   inputAccessoryView  property
  • – reloadInputViews
タッチイベントに応答する
  • – touchesBegan:withEvent:
  • – touchesMoved:withEvent:
  • – touchesEnded:withEvent:
  • – touchesCancelled:withEvent:
モーションイベントに応答する
  • – motionBegan:withEvent:
  • – motionEnded:withEvent:
  • – motionCancelled:withEvent:
アンドゥを取得する
  •   undoManager  property
コマンドを有効にする
  • – canPerformAction:withSender:

ビューのベースクラスは何が良いか

ビューを構成する際のベースとなるクラスは、View-based Applicationをひな形とした場合、UIViewクラスとなります。
しかしながら、UIViewクラスはタッチイベントをハンドリングすることができません。

そこで、ベースとなるクラスをUIViewクラスを継承したUIControlクラスとすると、部品以外の部分でもタッチイベントを持つことができ、そのイベントをもとにコントロールすることができます。

よく、キーボードを消したいのに消せないアプリがありますが、それはUIControlクラスをベースとしていないか、テキストフィールド以外をTouchUpしたとき、キーボードを消すためにテキストフィールドクラスををFirstResponderからはずす(resignする)resignFirstResponderメソッドを構成し、アクションとして呼び出していないためのようです。

- (IBAction) backgroundTap:(id)Tap{
[Name resignFirstResponder];
[Number resignFirstResponder]; 

以下では、デフォルトで「View」となっているnibのインスタンスが、「Control」となり、「Control」のTouch Dounイベントが、File's Ownerのアクションと接続されているのがわかるかと思います。要注意ですね。


2010年4月30日金曜日

UIControllEvent(Button)

UIControlクラス及びその派生クラスでは、ボタン等が押されたときのアクションとしてEventが定義(UIControlEvent定数)があります。ベースとなるクラスがUIControl(及びその派生クラス)の場合、これを(IBAction)で示したメソッドと結びつけることでトリガーとして受け取ることができるようです。

UIControlEventTouchDown
コントロール内でタッチした瞬間(touch-down)をイベントとして取得する

UIControlEventTouchDownRepeat
コントロール内でタッチを繰り返した場合: UITouch tapCount 目そっとで回数を指定する。

UIControlEventTouchDragInside
コントロール内でドラッグされた場合のイベント

UIControlEventTouchDragOutside
コントロール外でドラッグされた場合のイベント

UIControlEventTouchDragEnter
コントロールの外から中へドラッグされた場合のイベント

UIControlEventTouchDragExit
コントロルの中から外へドラッグされた場合のイベント

UIControlEventTouchUpInside
コントロール内でタッチアップした場合のイベント

UIControlEventTouchUpOutside
コントロール外でタッチアップした場合のイベント

UIControlEventTouchCancel
現在のタッチをキャンセルするシステムイベント

UIControlEventValueChanged
異なる種類の値を出力するため、ドラッグやその他のコントロールの操作

UIControlEventEditingDidBegin
UITextField オブジェクトに入るため、編集セッションを初期化するタッチ

UIControlEventEditingChanged
UITextFieldオブジェクト内の編集を変更するタッチ

UIControlEventEditingDidEnd
UITextField のオブジェクトを離れるために、編集セッションを終了するタッチ

UIControlEventEditingDidEndOnExit
UITextField オブジェクトの編集セッションを終了するタッチ

UIControlEventAllTouchEvents
全てのタッチイベント

UIControlEventAllEditingEvents
UITextField オブジェクトのための編集タッチの全て

UIControlEventApplicationReserved
アプリケーションが使用が可能なコントロールイベントの値の範囲

UIControlEventSystemReserved
インターナショナルフレームワークで使用のための予約されたコントロールイベントの値の範囲

UIControlEventAllEvents
システムイベントを含む全てのイベント

MainWindow.xib(nibファイル)

Interface Buiderのすごいところは、はじめに起動するインスタンスの生成をを開発者が意識せずに開発可能なところだそうです。通常の開発ツールは、ユーザインターフェイスのデザインにとどまるようですが、このnibファイルをもとにインスタンスを生成し、その相互関係までもGUIで定義する、ということのようです。Appleはえらい!!

ちなみに、nibファイルの中身は以下のものとなるようです。
     ・File's Owner      起動時にnibファイルを読み込むオブジェクト
     ・First Responder     ユーザが現在操作(インタラクト)しているオブジェクト
     ・その他   プログラムで使用するインスタンス(この場合、AppDelegate,View ControllerとWindow(1つ)となる)

UIApplicationDelegateプロトコル

プログラムの終了等にファイルの保存等の処理が必要なアプリケーションの基本動作をこのデリゲートに実装します。
〜AppDelegate.h, 〜AppDelegate.mに実装します。

必要時に以下のような機能を実装します。

アプリケーションの振る舞いの制御

URLリソースを開く

ステータスバーの初期設定

アクティブ状態での変更応答

アプリケーションの表示の管理

リモート通知のハンドリング


    アウトレットをリリースする。

    アウトレット生成時に、アウトレットを保持するようコードを書くことになりましたが、

     @property (nonatomic, retain) IBOutlet Objecttype *Object;

    そのため、実行後のdealloc時に、当該オブジェクトを解放する必要があるようです。

    -(void) dealloc {
     [Object release];
     [super dealloc];
    }

    押されたボタンを識別する。

    押されたボタンを識別する方法としては、ボタンのタイトル(Title)を確認する方法があります。
    また、ボタンのタグ(Tag)を使う方法があります。

    タイトルの場合言語に依存しますが、Tagを使う場合は言語に依存せず識別することができます。

    以下はTitleの場合です。

    @interface ViewController : UIViewController
    -(IBAction) buttonPressed:(id)button
    @end

    @imprementation ViewController
    -(IBAction) buttonPressed:(id)button{
      NSSting *button_name = [ button titleForState:UIControlStateNormal];
      // *button_nameにボタンのタイトルが入っているのでこれで識別する。
    }

    UIButton (ボタンクラス概要)

    UIButton機能区分とメソッドには以下があります。

    詳細はUIButton Class Referenceまで
    ボタンクラスの生成

    ボタンのイメージ設定




    – setImage:forState:
    ボタンの余白設定
      contentEdgeInsets  property
      titleEdgeInsets  property
      imageEdgeInsets  property
    現在の状態の取得
      currentTitle  property
      currentTitleColor  property
      currentTitleShadowColor  property
      currentImage  property
      currentBackgroundImage  property
      imageView  property

    ボタンの寸法の取得

    ーーーー UIControlState定数 ーーーーーーーー
    UIControlStateNormal
    通常のデフォルトのコントロール状態。使用可能な状態ですが、選択/ハイライトはされていない。

    UIControlStateHighlighted
    ハイライトされた状態。コントロールは、タッチ入力時とタッチ状態から出た時、トラッキング状態から出た時、タッチアップされた時にこの状態に入る。highlighted プロパティを通じ、この値を取得し、セットすることができる。

    UIControlStateDisabled
    コントロール状態を無効にする。 現在コントロールが利用不可となっていることを示す。enabled プロパティを通じ、この値を取得し、セットすることができる。

    UIControlStateSelected
    コントロール状態を選択する。 多くのコントロールではこの状態は振る舞いや見え方を変更しないが、UISwitchControl等のサブクラスに影響を及ぼす。selectedプロパティを通じ、この値を取得し、セットすることができる。

    UIControlStateApplication
    アプリケーションが使用することができる追加のコントロール状態のフラグ

    UIControlStateReserved
    内部のフレームワークが使用するための予約されたコントロール状態のフラグ

    ----------------- sample code -----------------

    -(void)viewDidLoad{
    UIImage *buttonImageNormal = [UIImage imageNamed:@"whiteButton.png"];
    UIImage *stretchableButtonImageNormal = [buttonImageNormal
    strectchableImageWithLeftCapWidth:12 topCapHeitht:0];
    [doSomethingButton setBackgroundImage:stretchableButtonImageNormal forState:UIControlStateNormal];
    UIImage *buttonImagePressed = [UIImage imageNamed:@"blueButton.png"];
    UIImage *stretchableButtonImagePressed = [buttonImagePressed stretchableImageWithLeftCapWidth:12 topCapHeight:0];
    [doSomethingButton setBackgroundImage:strectchableImagePressed forState:UIControlStateHighlighted];
    }
    ---------------------------------