2010-03-27 4 views
10

Wie kann man feststellen, wenn eine UISwitch innerhalb einer UITableViewCell abgegriffen wurde?Wie kann man feststellen, wenn ein UISwitch innerhalb einer UITableViewCell angezapft wurde?

Mein UISwitch ist innerhalb der Zelle (generischen Zelle) wie folgt ein:

UISwitch *mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease]; 
[cell addSubview:mySwitch]; 
cell.accessoryView = mySwitch; 

Und ich versuche einen Hahn wie diese zu erkennen (aber seine Arbeit nicht):

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath { 

    NSUserDefaults *prefs; 


    if(indexPath.section == 1){ 

     switch(indexPath.row) 
     { 
      case 0: 

       NSLog(@"Tapped Login Switch");    

       break; 
      default: 
       break; 
     } 

    } 


} 

Dave DeLong vorgeschlagen, dass ich eine Aktion für jeden Schalter als eine Lösung festlegen. Also habe ich folgendes den Schalter einzustellen:

 UISwitch *mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease]; 
     [mySwitch addTarget:self action:@selector(switchToggled2:) forControlEvents: UIControlEventTouchUpInside]; 
     if(at_songs){ 

      [mySwitch setOn:YES animated:NO]; 

     } 
     [cell addSubview:mySwitch]; 
     cell.accessoryView = mySwitch; 



und die folgenden zu wissen, wann er abgehört wurde:

-(IBAction)switchToggled1:(id)sender { 


    NSUserDefaults *prefs; 

    NSLog(@"Tapped Login Switch"); 

    prefs = [NSUserDefaults standardUserDefaults]; 

    if(at_login){ 
     [prefs setObject:@"NO" forKey:@"autotweet_login"]; 
     at_login = NO; 
    }else{ 
     [prefs setObject:@"YES" forKey:@"autotweet_login"]; 
     at_login = YES; 
    } 



} 

Einschalten des Schalters ist das kein Problem. Das Problem JETZT ist, dass, wenn der UISwitch auf OFF gestellt ist, seine Aktion aus irgendeinem Grund zweimal aufgerufen wird (und ich 2 NSLogs für 1 Tap bekomme).



Warum wird die Aktion zweimal für nur einen Wasserhahn immer genannt den Schalter auszuschalten? Wie repariere ich es?

Antwort

12

Geben Sie den Schalter ein Ziel und Aktion:

[mySwitch addTarget:self action:@selector(switchToggled:) forControlEvents: UIControlEventTouchUpInside]; 

Dann implementieren Ihre switchToggled: Methode:

- (void) switchToggled:(id)sender { 
    //a switch was toggled. 
    //maybe use it's tag property to figure out which one 
} 
+0

Danke. Anstatt die Tag-Eigenschaft zu verwenden, habe ich für jeden Switch eine spezifische Aktion (switchToggled1, switchToggled2) erstellt. Aber es gibt ein Problem: Wenn ich einmal auf den Schalter klicke, wird die Aktion aus irgendeinem Grund zweimal aufgerufen. Warum sollte es zweimal angerufen werden? (UPDATE: Das Ausschalten des Schalters ruft die Aktion zweimal auf, das Einschalten des Schalters ruft die Aktion nur einmal auf) – RexOnRoids

+0

Das sollte @selector NOT @selection im obigen Beispielcode sein. Das kostete mich ungefähr eine halbe Stunde Zeit, um das herauszufinden. –

+0

@ Chuck whoops! Das tut mir leid. Das ist der Nachteil der Eingabe von Code in einem Browser ... –

1

Ist das der switchToggled gelöst, warum ZWEIMAL genannt wird? Das passiert mir auch. Es protokolliert den NSLog zweimal. Aber in meinem Fall ist es zufällig. Manchmal auf OFF wird zweimal und manchmal auf ON gerufen. Anbringen des Protokoll

2010-08-17 18:12:30.264 SimplyPersonnelV1[3190:207] Auto Login turned on 
2010-08-17 18:12:33.032 SimplyPersonnelV1[3190:207] Auto Login turned off 
2010-08-17 18:12:33.032 SimplyPersonnelV1[3190:207] Auto Login turned off 
2010-08-17 18:12:33.760 SimplyPersonnelV1[3190:207] Auto Login turned on 
2010-08-17 18:12:46.223 SimplyPersonnelV1[3190:207] Auto Login turned off 
2010-08-17 18:12:47.383 SimplyPersonnelV1[3190:207] Auto Login turned on 
2010-08-17 18:12:48.000 SimplyPersonnelV1[3190:207] Auto Login turned off 
2010-08-17 18:12:48.623 SimplyPersonnelV1[3190:207] Auto Login turned on 
2010-08-17 18:12:49.176 SimplyPersonnelV1[3190:207] Auto Login turned off 
2010-08-17 18:12:59.687 SimplyPersonnelV1[3190:207] Auto Login turned on 
2010-08-17 18:12:59.688 SimplyPersonnelV1[3190:207] Auto Login turned on 
2010-08-17 18:13:00.246 SimplyPersonnelV1[3190:207] Auto Login turned off 
2010-08-17 18:13:00.759 SimplyPersonnelV1[3190:207] Auto Login turned on 
2010-08-17 18:13:00.759 SimplyPersonnelV1[3190:207] Auto Login turned on 
2010-08-17 18:13:05.638 SimplyPersonnelV1[3190:207] Auto Login turned off 
2010-08-17 18:13:06.391 SimplyPersonnelV1[3190:207] Auto Login turned on 
2010-08-17 18:13:06.391 SimplyPersonnelV1[3190:207] Auto Login turned on 
2010-08-17 18:13:07.078 SimplyPersonnelV1[3190:207] Auto Login turned off 
2010-08-17 18:13:07.830 SimplyPersonnelV1[3190:207] Auto Login turned on 
2010-08-17 18:13:07.830 SimplyPersonnelV1[3190:207] Auto Login turned on 
2010-08-17 18:13:08.622 SimplyPersonnelV1[3190:207] Auto Login turned off 
2010-08-17 18:13:09.261 SimplyPersonnelV1[3190:207] Auto Login turned on 
2010-08-17 18:13:09.262 SimplyPersonnelV1[3190:207] Auto Login turned on 
2010-08-17 18:13:15.565 SimplyPersonnelV1[3190:207] Auto Login turned off 
2010-08-17 18:13:16.485 SimplyPersonnelV1[3190:207] Auto Login turned on 
2010-08-17 18:13:16.486 SimplyPersonnelV1[3190:207] Auto Login turned on 
+0

Wurde das jemals gelöst? Ich fand heraus, dass ein '[table reloadData]' am Ende der 'switchChanged:' Methode meine 'switchChanged:' Methode zweimal ausgelöst hat. –

11

für Menschen Schwierigkeiten mit mehreren Berührungen mit haben Sie die Kontrolle Ereignis UIControlEventValueChanged versucht Wechsel

[catSwitch addTarget:self action:@selector(catSwitched:) forControlEvents: UIControlEventValueChanged]; 

Ich bin nicht Probleme auf diese Weise mit.

+0

Sie können auch 'valueChanged:' im '@ Selektor' verwenden. –