2012-08-30 12 views
8

Mam UITableview, że wyświetlam niektóre zadania, a każdy wiersz ma pole wyboru do oznaczania zadań kompletnych lub nie.Wybór akcesorium UITableViewCell AccessoryView, niezależnie od wybierania wiersza

Czekam, aby przełączyć zaznaczenie, gdy użytkownik dotknie pola wyboru, i przejść do widoku szczegółowego, gdy użytkownik dotknie wiersza. Ten ostatni jest proste, wystarczy za pomocą

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

Jednak chciałem oddzielić obszary selekcji, przełączając tylko pole wyboru po wybraniu accessoryview i wchodząc w widoku szczegółowym tylko wtedy, gdy jest wybrana reszta komórki. Jeśli dodaję UIbutton do wnętrza accessoryview, użytkownik wybierze wiersz ORAZ UIButton, gdy chce tylko uderzyć w pole wyboru, prawda?

Co się stanie, jeśli użytkownik przewijał widok tabeli, przeciągając wzdłuż accessoryview? Czy nie wywoła to akcji na urządzeniu Touch-Up UIButton?

Ktoś ma jakieś pomysły, jak to zrobić? Dziękuję za Twój czas!

Odpowiedz

16

Jak o zarządzaniu krany akcesoriów wewnątrz tej metody delegata:

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

EDIT:

można zrobić coś takiego dla niestandardowego accessoryView który reaguje na accessoryButtonTappedForRowWithIndexPath: metody.

W cellForRowAtIndexPath: Method -

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; 
[button setBackgroundImage:image forState:UIControlStateNormal]; 

[button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside]; 
button.backgroundColor = [UIColor clearColor]; 
cell.accessoryView = button; 

- (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]; 
} 
+1

Jak masz niestandardowy przycisk akcesoria oddzwonić do delegata widoku stołu? –

+0

Wow, nie wiem, jak to przegapiłem, przepraszam za głupie pytanie i dzięki za pomoc! Dam ci ten strzał, wygląda na to, że tego właśnie szukałem. – Cody

+1

@CarlVeazey Dobry punkt, dokumentacja mówi, że akcesorium ButtonTappedForRowWithIndexPath odpowiada na typ akcesorium przycisku ujawnienia, który nie jest typem, którego chcę użyć, ponieważ chcę pole wyboru. Mogę to obejść, używając przycisku ujawnienia dla widoku szczegółowego, i dotykając reszty wiersza, aby przełączyć znacznik wyboru w innym miejscu w wierszu, ale nie tego chciałem. – Cody

Powiązane problemy