Ankit Srivastava
Ankit Srivastava

Reputation: 12405

Check if any textfield, textview or label changed for a UIViewController..?

I have a view controller and it contains n number of UITextFields and UItextViews and UILabels, is there anyhow I can get notified if any of them changes..?

I can do it by manually looking at each of them in their respective TextDidChangeNotification and similar but I am looking for a more optimized way of doing this, where I don't have to worry about each of them .

Upvotes: 0

Views: 664

Answers (3)

David Hoerl
David Hoerl

Reputation: 41642

// 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) New ivar:

{
    NSMutableDictionary *savedValues; 
}

1) When you want to baseline the values:

savedValues = [self snapshot];

2) call this to baseline current values initially then at any later point:

- (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) When you want to see if anything changed:

- (BOOL)anyChanges
{
    NSDictionary *currentDict = [self snapshot];
    return [currentDict isEqualToDictionary:savedValues];
}

Upvotes: 3

Paresh Navadiya
Paresh Navadiya

Reputation: 38239

Make your class to handle UIControlEventValueChanged event in your textfield, textview or label's value is changed. Add this line ViewDidLoad method:

  [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];

Now selector would be called when ever value is changed

- (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) 
     ....
     ....
  }
 }

Upvotes: 0

Hardeep Singh
Hardeep Singh

Reputation: 942

You should use one method for all textFields, textView and Labels. and give a unique tag to textFields and textViews and labels. which help you for define it's textField ,textView or 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.

}

Upvotes: 0

Related Questions