@interface ~ @end
- 機能を定義する
.mの@interface ~ @end
か、.hの@interface ~ @end
に
メソッドを定義する
.mか.hに入れる違いは他のファイルとそのメソッドを共有するかしないかで決める。
.hにもinterfaceがあるのに、.mにも@interface?
http://stackoverflow.com/questions/11594391/why-is-there-interface-above-implementation
class extenstion
class extension : empty parentheses(からの括弧)で表現される
@interface MyClass ()
category
category : non-empty pair of parentheses(何かが書いてある括弧)で表現される
@interface MyClass (CategoryName)
- categoryにはinstance variableは追加できない
- classの拡張の用途で利用
- 既存のクラスをサブクラスを生成せずにメソッドを追加できる
NSString-Utilities.h
このように+
をいれたファイル名はカテゴリークラスの命名ルール
.mに@implementの上にある@interfaceはprivateメソッドで利用するものを定義するのに利用される。(class extension)
// class extension
@interface MyClass ()
// ここにprivate methodなどを宣言
- (void)doSomething;
@end
// category
@interface MyClass (CategoryName)
//
- (void)doSomething;
@end
typedef
typedef NSUInteger
class method , instance method
- : class method
- : instance method
Date
```
# AppDelegate class & ViewController class
* AppDelegate : アプリが起動した直後、停止、復旧の際に行う処理
* ViewController : 画面の操作に応じる処理を書く
# header file
import <フレームワーク/ファイル>
import ソースファイル
@interface クラス名 : スーパークラス名<プロトコル> { インスタンス変数宣言; } プロパティ変数宣言; メソッド宣言; @end
## IBOutlet & IBAction
@propertyに書いてある `IBOutlet`はコンパイラに指示するキーワードであり、コンパイルときには取り除かれて通常のプロパティ宣言と同じ書式になる
戻り値に`IBAction`も同様、部品のactionと接続するメソッドであることをコンパイラにしめす
@interface ViewController ()
//アウトレットと接続を示している。 @property (weak, nonatomic) IBOutlet UITextField *myTextField;
- (IBAction)updateValue:(id)sender; // 戻り値の(IBAction)は部品のactionと接続するメソッドであることをコンパイラにしめす
//通常 @property (assign) NSInteger counter;
@end
@implementation
// storyboardからcontrolでつなげて作ったactionメソッドが @interface部分で作られるときには以下も同時に生成される。
- (IBAction)updateValue:(id)sender {
}
@end
## sender
- (IBAction)updateValue:(id)sender {
}
このような形だと
idタイプのsenderはそのままでは使えない
例えば sender.valueで sliderなとのOutletの値が取得できるが、idタイプにはvalueのメソッドはない。
なので、
1. このように、データ型を変更する
(IBAction)updateValue:(id)sender { UiSlider *mySlider = sender; } ```
そもそもメソッドを作るときにtypeを指定する
@interface
- (IBAction)updateValue:(UISlider *)sender;
//....
@implementation
- (IBAction)updateValue:(UISlider *)sender {
UiSlider *mySlider = sender;
}
//...
Outlet Collection
複数の部品を配列で扱えるようになる。
@interface
@property (strong, nonatomic) IBOutletCollection(UITextField) NSArray *colorNames;
//...
@implementation
for (UITextField *fld in _colorNames) {
fld.placeholder = @"placeholder";
}
//...
tag
複数のボタンを一つのactionに紐づけて tagをつける(10,11,12,13) それを switchで区分して処理するなどで利用できる。
@interface
- (IBAction)touchWordButton:(UIButton *)sender;
@end
@implementation
- (IBAction)touchWordButton:(UIButton *)sender {
NSString *word;
switch (sender.tag) {
case 10:
word = @"FLOWER";
break;
case 11:
word = @"BIRD";
break;
case 12:
word = @"WIND";
break;
case 13:
word = @"MOON";
break;
}
_wordLabel.text = word;
}
@end
UIViewController
イベント発生順
アプリが起動したとき
viewDidLoad
viewWillAppear
viewWillLayoutSubviews
viewDidLayoutSubivews
viewDidAppear
他のビューに移動したとき
viewWillDisappear
viewWillLayoutSubviews
viewDidLayoutSubviews
viewDidDisappear
説明
init(インスタンス作成時に呼び出したイニシャライザ) ↓ viewDidLoad ・View が初めて呼び出される時に1回だけ呼ばれます。 ・アプリ起動後に初めて当Viewが表示された場合に1度だけ呼ばれます。 ↓ viewWillAppear ・View が表示される直前に呼ばれるメソッド ・タブ等の切り替え等により、画面に表示されるたびに呼び出されます。 ・タブが切り替わるたびに何度でも呼ばれます。 ↓ viewDidAppear ・View の表示が完了後に呼び出されるメッソド ・タブ等の切り替え等により、画面に表示されるたびに呼び出されます。 ・タブが切り替わるたびに何度でも呼ばれます。 ↓ viewWillDisappear ・View が他のView (画面から消える) 直前に呼び出されるメッソド ・View が他のView (画面から消える) 直前に呼び出されるメッソド ・タブが切り替わるたびに何度でも呼ばれます。 ↓ viewDidDisappear ・View が他のView (画面から消えた) 非表示後に呼び出されるメッソド ・View が他のView (画面から消える) 直前に呼び出されるメッソド ・タブが切り替わるたびに何度でも呼ばれます。