2010-12-13 22 views
1

J'ai une application basée sur CoreDataBooks. Je veux basculer deux images dans le bouton d'accessoire de cellule comme indiqué dans l'exemple de code iOS, mais je cours dans un barrage routier. Je ne peux pas comprendre comment obtenir le UITableViewCell qui est noté dans la méthode accessoryButtonTappedForRowWithIndexPath:. L'échantillon stockait l'objet dans l'élément en tant que valeur-clé, mais je n'arrive pas à comprendre comment le faire avec mes données patient et de base.Comment obtenir UITableViewCell dans un exemple d'accessoire en utilisant des données de base

Tout d'abord, voici le code correspondant de l'échantillon accessoire:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *kCustomCellID = @"MyCellID"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCustomCellID]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCustomCellID] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
     cell.selectionStyle = UITableViewCellSelectionStyleBlue; 
    } 

    NSMutableDictionary *item = [dataArray objectAtIndex:indexPath.row]; 
    cell.textLabel.text = [item objectForKey:@"text"]; 

    [item setObject:cell forKey:@"cell"]; 

    BOOL checked = [[item objectForKey:@"checked"] boolValue]; 
    UIImage *image = (checked) ? [UIImage imageNamed:@"checked.png"] : [UIImage imageNamed:@"unchecked.png"]; 

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    CGRect frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height); 
    button.frame = frame; // match the button's size with the image size 

    [button setBackgroundImage:image forState:UIControlStateNormal]; 

    // set the button's target to this table view controller so we can interpret touch events and map that to a NSIndexSet 
    [button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside]; 
    cell.backgroundColor = [UIColor clearColor]; 
    cell.accessoryView = button; 

    return cell; 
} 


- (void)checkButtonTapped:(id)sender event:(id)event 
{ 
    NSSet *touches = [event allTouches]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentTouchPosition = [touch locationInView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition]; 
    if (indexPath != nil) 
    { 
     [self tableView: self.tableView accessoryButtonTappedForRowWithIndexPath: indexPath]; 
    } 
} 


- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 
{ 
    NSMutableDictionary *item = [dataArray objectAtIndex:indexPath.row]; 

    BOOL checked = [[item objectForKey:@"checked"] boolValue]; 

    [item setObject:[NSNumber numberWithBool:!checked] forKey:@"checked"]; 

    UITableViewCell *cell = [item objectForKey:@"cell"]; 
    UIButton *button = (UIButton *)cell.accessoryView; 

    UIImage *newImage = (checked) ? [UIImage imageNamed:@"unchecked.png"] : [UIImage imageNamed:@"checked.png"]; 
    [button setBackgroundImage:newImage forState:UIControlStateNormal]; 
} 

Je suis en mesure de mettre mon image correctement à l'aide d'un « contrôle » propriété de « Y » ou « N » que je peut stocker dans CoreData, comme il est indiqué ci-dessous:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    [self configureCell:cell atIndexPath:indexPath]; 
    return cell; 
} 


- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath { 

    Patient *patient = [fetchedResultsController_ objectAtIndexPath:indexPath]; 

    cell.textLabel.text = patient.name; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; 

    UIImage *image = [UIImage imageNamed:@"unchecked.png"]; 

    if ([patient.check isEqualToString: @"Y"] == YES) 
     image = [UIImage imageNamed:@"checked.png"]; 

     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
     CGRect frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height); 
     button.frame = frame; // match the button's size with the image size 

     [button setBackgroundImage:image forState:UIControlStateNormal]; 

    // set the button's target to this table view controller so we can interpret touch events and map that to a NSIndexSet 
    [button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside]; 
    cell.backgroundColor = [UIColor clearColor]; 
    cell.accessoryView = button; 
} 

Cependant, je rencontre des problèmes avec cette méthode, comme il est indiqué dans le code:

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

    Patient *patient = [fetchedResultsController_ objectAtIndexPath:indexPath]; 

    // HOW CAN I OBTAIN THE UITABLEVIEWCELL?  
    UITableViewCell *cell = [item objectForKey:@"cell"]; 
    UIButton *button = (UIButton *)cell.accessoryView; 

    UIImage *newImage = (checked) ? [UIImage imageNamed:@"unchecked.png"] : [UIImage imageNamed:@"checked.png"]; 
    [button setBackgroundImage:newImage forState:UIControlStateNormal]; 
} 

J'apprécie toute aide.

AMENDEMENT: Grâce à BoltClock, tout est arrivé. Poster le code final au cas où quelqu'un d'autre voudrait utiliser cette méthodologie.

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

    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; 
    Patient *patient = [fetchedResultsController_ objectAtIndexPath:indexPath]; 

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    UIButton *button = (UIButton *)cell.accessoryView; 
    UIImage *image = [UIImage imageNamed:@"checked.png"]; 

    // patient.check is a string value set to either "Y" or "N" 
    // This allows the check mark to be permanently saved 
    if ([patient.check isEqualToString: @"Y"] == YES) { 
     image = [UIImage imageNamed:@"unchecked.png"]; 
     patient.check = @"N"; 
    } 
    else { 
     // image defaults to checked.png 
     // image = [UIImage imageNamed:@"checked.png"]; 
     patient.check = @"Y"; 
    } 

    [button setBackgroundImage:image forState:UIControlStateNormal]; 

    // Save patient.check value 
    NSError *error = nil; 
    if (![context save:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
} 
+0

Merci pour le message clair. Est-il possible de recevoir le code source? Toute réponse est appréciée. – Foo

Répondre

6

utiliser la méthode voir la table d'cellForRowAtIndexPath: et passe dans le chemin d'index comme argument.

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

    Patient *patient = [fetchedResultsController_ objectAtIndexPath:indexPath]; 

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    UIButton *button = (UIButton *)cell.accessoryView; 

    UIImage *newImage = (checked) ? [UIImage imageNamed:@"unchecked.png"] : [UIImage imageNamed:@"checked.png"]; 
    [button setBackgroundImage:newImage forState:UIControlStateNormal]; 
} 
+0

Merci! C'était la pièce dont j'avais besoin. J'ai modifié ma question pour publier la solution finale, y compris l'enregistrement de cette donnée de base. – jon

+1

@jon: Content d'avoir été utile! :) – BoltClock