私はView Controllerを持っていて、n個のUITextFields
andUItextViews
とが含まれていUILabels
ますが、それらのいずれかが変更された場合に通知を受け取ることができます..?
それぞれを手動でそれぞれのTextDidChangeNotification
同様の方法で見ることで実行できますが、それぞれについて心配する必要がない、より最適化された方法を探しています。
私はView Controllerを持っていて、n個のUITextFields
andUItextViews
とが含まれていUILabels
ますが、それらのいずれかが変更された場合に通知を受け取ることができます..?
それぞれを手動でそれぞれのTextDidChangeNotification
同様の方法で見ることで実行できますが、それぞれについて心配する必要がない、より最適化された方法を探しています。
// Assumes you don't use tag values now - if you do small change to create
// and index set, add the ones you use, so all new ones assigned are unique.
// assumes ARC
1) 新しい ivar:
{
NSMutableDictionary *savedValues;
}
1) 値をベースライン化したい場合:
savedValues = [self snapshot];
2) これを最初に現在の値のベースラインに呼び出し、その後任意の時点で呼び出します。
- (NSMutableDictionary *)snapshot
{
NSInteger tag = 1;
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:[self.view.subviews count]];
for(UIView *v in self.view.subviews) {
if([v isKindOfClass:[UILabel class]] || [v isKindOfClass:[UITextField class]] || [v isKindOfClass:[UITextView class]]) {
if(v.tag == 0) v.tag = tag++; // will happen once
// EDIT below
[dict setObject:[NSString stringWithString:[(id)v text]] forKey:[NSNumber numberWithInteger:tag]];
}
}
return dict;
}
4) 何かが変わったかどうかを確認したい場合:
- (BOOL)anyChanges
{
NSDictionary *currentDict = [self snapshot];
return [currentDict isEqualToDictionary:savedValues];
}
すべてのtextFields、textView、およびLabelsに対して1つのメソッドを使用する必要があります。textFieldsとtextViewsおよびlabelsに一意のタグを付けます。これは、textField、textView、またはLabelを定義するのに役立ちます。
if(sender.tag == 1000)//UILabel
{
UILabel *label=(UILabel *)sender
//write own code for label what do you want.
}
else if(sender.tag == 2000)//UITextField
{
UITextField *textField=(UITextField *)sender
//write own code for textField what do you want.
}
else if(sender.tag == 3000)// UITextView
{
UITextView *textView=(UITextView *)sender
//write own code for textView what do you want.
}
テキストフィールド、テキストビュー、またはラベルの値が変更された UIControlEventValueChanged イベントを処理するクラスを作成します。次の行 ViewDidLoad メソッドを追加します。
[youLabel addTarget:self action:@selector(valueChanged:)
forControlEvents:UIControlEventValueChanged];
// add for textfield, textview also if needed
[youTextField addTarget:self action:@selector(valueChanged:)
forControlEvents:UIControlEventValueChanged];
[youTextView addTarget:self action:@selector(valueChanged:)
forControlEvents:UIControlEventValueChanged];
値が変更されるたびにセレクターが呼び出されるようになりました
- (void) valueChanged:(id)sender{
if(sender isKindofClass[UILabel class])
{
//label value changed here to differntiate used tag
if([sender tag] == 0)
....
....
}
else if(sender isKindofClass[UITextField class])
{
// textField value changed to differntiate used tag
if([sender tag] == 0)
....
....
}
else if(sender isKindofClass[UITextView class])
{
// textview value changed to differntiate used tag
if([sender tag] == 0)
....
....
}
}