2010-03-12 5 views

Odpowiedz

7

Nie zakodowałem tego, ale oto pomysł.

Tworzenie selectionIndexPath w .h

NSIndexPath *selectionIndexPath; 

Następnie w .m

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

Zapisz indexPath do selectionIndexPath i zadzwonić:

[self.tableView setEditing:YES]; 

potem w:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 

if (selectionPath.row == indexPath.row) 
    { 
     return UITableViewCellEditingStyleDelete; 
    } 
    else 
    { 
     return UITableViewCellEditingStyleNone;  
    } 
} 

Można również złapać dotknięcia, a następnie zrobić mniej więcej to samo. Coś w tym stylu ...

NSSet *touches = [event allTouches]; 
UITouch *touch = [touches anyObject]; 
CGPoint currentTouchPosition = [touch locationInView:self.tableView]; 
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition]; 
if (indexPath != nil) 
{ 
     // save indexPath and setEditing Mode here 
} 

Nie miałem czasu, aby to zakodować, ale to jest główny pomysł.

+0

@Jordan, dziękuję, to jest ten sam pomysł, który miałem, ale tworzy irytujące migotanie, gdy stół przechodzi w tryb edycji i nie wydaje się bardzo naturalny. Uważam, że PO powinien wdrożyć przesunięcie do usunięcia, tak jak sugeruje Ian Henry lub trzymać się bardziej standardowego podejścia. – DyingCactus

+0

Można również użyć animacji, ale zgadzam się. – Jordan

+0

Dzięki Jordan, wydaje się pracować. :) – msk

3

wdrożyć metodę editingStyleForRowAtIndexPath:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row == 3) 
    { 
     return UITableViewCellEditingStyleDelete; 
    } 
    else 
    { 
     return UITableViewCellEditingStyleNone;  
    } 
} 

//
//
EDIT: Jak można wyjaśnić w swoich komentarzach, chcesz pozwolić bezstykowa użytkownika w komórce, a następnie usuń lub przenieś komórkę.

Wierzę, że pozwala to użytkownikowi na wykonanie obu, tabela (nie tylko komórka) musi być umieszczona w trybie edycji, a jeśli zrobisz to tylko wtedy, gdy użytkownik przeciągnie komórkę, pojawi się irytujące migotanie, gdy stół przerysowuje się, aby zrobić miejsce dla przycisków wstawiania/usuwania. Jordan podał przykładowy kod, aby to zrobić.

Alternatywą, zgodnie z sugestią Iana Henryka, jest wprowadzenie przesunięcia do usunięcia. Jednak wydaje się, że nie istnieje odpowiednik przesunięcia w ruchu. Aby wdrożyć bezstykowa-to-delete, wykonaj następujące czynności:

  • keep edycja tabeli wyłączony
  • wdrożyć editingStyleForRowAtIndexPath i tylko return UITableViewCellEditingStyleDelete niezależnie od indexpath
  • wdrożyć willBeginEditingRowAtIndexPath ale zrobić nic w nim
  • wdrożyć commitEditingStyle i w nim usuń wiersz ze źródła danych i zadzwoń pod numer deleteRowsAtIndexPaths

Teraz, gdy użytkownik przeciągnie cel l, po prawej stronie pojawi się przycisk Usuń. Jeśli użytkownik kliknie, że zostanie wywołana funkcja commitEditingStyle, a użytkownik kliknie cokolwiek innego, operacja usunięcia zostanie anulowana.

+0

DyingCactus! To nie wystarczy. Ponieważ ustawiłoby to tylko tryb edycji dla wiersza 3. Chcę ustawić tryb edycji dla wiersza, przez który użytkownik przeskoczył. – msk

+0

Ok, przepraszam źle zrozumiałem twoje pytanie. Więc zasadniczo chcesz umieścić tabelę w trybie edycji, gdy użytkownik kliknie komórkę? – DyingCactus

+0

Dodam możliwy sposób później, ale czy któreś z aplikacji Apple to zrobić? Nie jestem pewien, czy podąża za HIG. – DyingCactus

2

Istnieje również metoda -setEditing:animated: dla UITableViewCell.Więc jeśli przesłonisz go w niestandardowym UITableViewCell i wyślesz wiadomość do super tylko jeśli jest możliwa do edycji, możesz osiągnąć to, co chcesz.

Aby było bardziej zrozumiałe. Podklasy UITableViewCell i utrzymać bool w nim, mówią:

@interface CustomTableViewCell : UITableViewCell 
{ 
    BOOL cellEditable; 
} 
@property (readwrite, assign) BOOL cellEditable; 

@end 

Następnie w Tableview metody delegata zwrócić przedmiot CustomTabeViewCell z własnością cellEditable odpowiednio ustawić dla wiersza (czy rząd jest edytowalny, czy nie).

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomTableViewCell *newCell = [[CustomTableViewCell alloc] init]; 
    if (row_is_editable) 
     [newCell setCellEditable:YES]; 
    else 
     [newCell setCellEditable:NO]; 
    return [newCell autorelease]; 
} 

Według dokumentacji - (void)setEditing:(BOOL)editing animated:(BOOL)animated metody UITableViewCell za -

„Po wywołaniu tej metody z wartością edycji jest ustawiona na TAK, a obiekt UITableViewCell jest skonfigurowany tak, aby mieć kontrole, komórka pokazuje wstawianie (zielony plus) lub kontrola usuwania (czerwony minus) po lewej stronie każdej komórki i zmiana kolejności po prawej stronie Ta metoda jest wywoływana w każdej widocznej komórce, gdy wywoływana jest metoda setEditing: animated: metoda UITableView. z ustawieniem edycji na NIE usuwa elementy sterujące z komórki. "

Więc wszystko co musisz zrobić, to zastąpić -setEditing: animowany: metoda w naszym CustomTableViewCell i wykonać to:

-(void)setEditing:(BOOL)editing animated:(BOOL)animated 
{ 
    if ([self cellEditable]) 
    { 
     [super setEditing:editing 
       animated:animated]; 
    } 
    else 
    { 
     [super setEditing:NO 
       animated:NO]; 
    } 
} 

i gotowe, teraz kiedy wyzwolić -setEditing:animated: na widoku tabeli, tylko wiersze, których komórki ustawiłeś jako cellEditable, będą edytowalne.