0

私はView Controllerを持っていて、n個のUITextFieldsandUItextViewsとが含まれていUILabelsますが、それらのいずれかが変更された場合に通知を受け取ることができます..?

それぞれを手動でそれぞれのTextDidChangeNotification同様の方法で見ることで実行できますが、それぞれについて心配する必要がない、より最適化された方法を探しています。

4

3 に答える 3

3
// 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];
}
于 2012-08-27T13:39:31.817 に答える
0

すべての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.

}
于 2012-08-27T13:01:24.480 に答える
0

テキストフィールド、テキストビュー、またはラベルの値が変更された 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) 
     ....
     ....
  }
 }
于 2012-08-27T12:51:54.333 に答える