plistによるデータの保存
- コードに直接データを書き込むのは合理的なアプローチではありません。データが頻繁に変更される場合、対応するコードを頻繁に開いて修正しなければなりません。
- そのため、頻繁に変更されるデータをファイルに保存しておき、番組開始後にそのファイルから最新のデータを読み込むという方法も考えられます。データを変更したい場合は、コードを修正することなく、データファイルを直接修正することができます。
- 一般に、NSArray や NSDictionary などのデータを格納するためにプロパティリストファイルを使用することができ、このような「プロパティリストファイル」は拡張子が plist であるため、「plist ファイル」とも呼ばれます。
- ファイル名は "Info "にはできません。
// 1. plistファイルにデータを書き込む。
NSArray *names = @[@"1", @"2", @"3"];
NSString *path = [[NSBundle mainBundle] pathForResource:@"names" ofType:@"plist"];
BOOL flag = [names writeToFile:path atomically:YES];
if (flag) {
NSLog(@"成功を書き込む")
}
// 2. plistファイルからデータを読み込む
[NSArray arrayWithContentsOfFile:path];
モデル
辞書からモデルへ
- モデル
データ保持専用のオブジェクト
一般的にNSObjectを継承し、.hファイルでデータを保持するための属性を宣言します。
クラス接頭辞 - 辞書の代わりにモデルを使うメリット
辞書を使用する場合、一般的にデータの設定や取り出しには「文字列型キー」を使用します。
これらのキーを記述する際、コンパイラにはインテリジェンスがありません。
コンパイラが警告を出したりエラーを報告したりすることなく、キーが誤って記述される可能性があります。
データ・モデルはデータを保持するために設計されたオブジェクトであり、データを表現するために使用する方が専門的です。
モデルを使用してプロパティにアクセスする場合、コンパイラはコーディング効率を向上させるための一連のヒントを提供します。
instancetype
// 呼び出しやすいクラス・メソッドを用意する
+ (instancetype)personWithDict:(NSDictionary *)dict;
// 戻り値の型検出、instancetypeを戻り値として使用、型の不一致は警告される。
NSString *str = [DGPerson personWithDict:dict];
カスタムコントロール
カスタム・コントロール:システムのコントロールを継承し、独自のコントロールを記述します。
目的:コントロールの内部にいくつかの詳細をカプセル化します。
initWithFrame:
/**
子コントロールの initWithFrame はオーバーライドしたほうがよい。:メソッドをオーバーライドしない。
外部コントロールがinitメソッドで初期化されると、システムは自動的にinitWithFrameを呼び出す。:
*/
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
}
return self;
}
layoutSubviews
/**
子コントロールを配置し、位置とサイズを設定する。
メソッド呼び出しのタイミング:
現在のコントロールが最初に表示されるとき
現在のコントロールのサイズが変更されたとき
*/
- (void)layoutSubviews {
[super layoutSubviews];
NSLog(@"%@", NSStringFromCGRect(self.frame));
}
xib
xibストーリーボードとの比較
- 共通点
どちらもソフトウェアインターフェースの記述に使用
どちらもInterface Builderツールキットで編集します。
どちらも基本的にコードを変換してコントロールを作成 - 相違点
xibは軽量で、ローカルのUIインターフェイスを記述するのに使われます。
storyboardは重量級で、ソフトウェア全体の複数のインターフェイスを記述するために使用され、複数のインターフェイス間のジャンプ関係を示すことができます。
基本的な使い方
- xibファイルのロード
/**
.c -> コンパイルに成功する。> .o
xib -> nib
*/
// 最初の方法
NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"test" owner:nil options:nil];
// 第二の方法
UINib *nib = [UINib nibWithNibName:@"test" bundle:nil]; //nil引数を渡す。デフォルトはmainBundle。
NSArray *array = [nib instantiateWithOwner:nil options:nil];
// xibサイズが設定されていない場合、ロードされたコントロールはデフォルトのサイズを持つ。
UIView *view = array.firstObject;
[self.view addSubview:view];
- カスタムビューのラッピング xib セットアップデータ デュアルインターフェースの開き方は?
xibファイルを開き、optionキーをクリックし、同時に.mファイルを開きます。 - コントロールがxibで作成された場合、initWithFrame:メソッドは初期化中に呼び出されません。
- コントロールがxibから作成される場合、初期化中にinitWithCoder:メソッドが呼び出されます。
- (instancetype)initWithCoder:(NSCoder *)coder;
/// コントロールがxibから作成された場合、ロード時に
- (void)awakeFromNib;
ローディングの原則
DGPersonView *personView = [[DGPersonView alloc] initWithCoder:nil];
personView.frame = CGRectMake(0, 0, 70, 90);
personView.backgroundColor = [UIColor orangeColor];
UIImageView *iconImageView = [[UIImageView alloc] initWithCoder:nil];
iconImageView.frame = CGRectMake(0, 0, 70, 70);
iconImageView.image = [UIImage imageNamed:@"icon"];
[personView addSubview:iconImageView];
personView.iconImageView = iconImageView;




