检查是否为UIViewController更改了任何文本字段,textview或标签..?

时间:2012-08-27 12:42:24

标签: iphone objective-c ios uiviewcontroller

我有一个视图控制器,它包含n个UITextFieldsUItextViews以及UILabels,无论如何,如果有任何更改,我会收到通知吗?

我可以通过在他们各自的TextDidChangeNotification和类似地手动查看它们来实现它,但我正在寻找一种更优化的方式来做到这一点,我不必担心它们中的每一个。

3 个答案:

答案 0 :(得分: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)新的伊娃:

{
    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];
}

答案 1 :(得分:0)

让您的类处理文本字段中的UIControlEventValueChanged事件,更改textview或label的值。添加此行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) 
     ....
     ....
  }
 }

答案 2 :(得分:0)

您应该为所有textFields,textView和Labels使用一种方法。并为textFields和textViews和标签提供唯一标签。它可以帮助您定义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.

}