2013-10-20 15 views
7

Mój UITableView potrzebuje 2 kliknięć, aby wyświetlić stronę szczegółów wybranej komórki: jedną do wyboru i drugą do pokazania widoku szczegółów. Chciałbym, aby jeden wiersz pokazał szczegółowy widok klikniętej komórki.Modal segue potrzebuje 2 kliknięć zamiast jednego

używam segue modalnego z tej metody w moim UITableViewManager.m:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showDetail"]) { 
     NSIndexPath *indexPath = [playerList indexPathForSelectedRow]; 
     TCPlayerStat *object = _objects[indexPath.row]; 
     [[segue destinationViewController] setPlayerStat:object]; 
    } 
} 

Nie mogę pracować z segue Push bo nie mam kontroler nawigacyjny (i tak naprawdę nie chcą).

Sprawdziłem w Inspektorze atrybutów TableView, ale nie znalazłem niczego odpowiedniego dla tego. Mam zaznaczone zaznaczenie "Pojedynczy wybór" i zaznaczenie "Pokaz wyboru zaznaczenia". Nie wiem, czy to możliwe, a jeśli tak, gdzie szukać ..

Dzięki za pomoc.


EDIT 1: Gdy piszę te dwie metody, jak ta, to nadal nie działa (potrzebuje 2 kliknięcia) i mam nowy dziennik ostrzegawczy:

„Ostrzeżenie: próba przedstawienia TCDetailViewController: 0xa27b900 na TCRootViewController: 0xa24f050 podczas trwania prezentacji! "

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self performSegueWithIdentifier:@"showDetail" sender:self]; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showDetail"]) { 
     NSIndexPath *indexPath = [playerList indexPathForSelectedRow]; 
     TCPlayerStat *object = _objects[indexPath.row]; 
     TCDetailViewController *detailViewController = [segue destinationViewController]; 
     [detailViewController setPlayerStat:object]; 
    } 
} 

EDIT 2: Nie wiem dlaczego, ale czasami działa idealnie i nie potrzebuje drugiego kliknij na widoku tabeli. Nie można dowiedzieć się:/


Rozwiązanie poniżej

+0

Spróbuj, czy wybrałeś wiersz na ścieżce indeksu - a następnie z tego miejsca. – DogCoffee

Odpowiedz

13

Rozumiem, jaki był problem!

Zmieniłem parametr na Storyboard, którego nie powinienem mieć. Chciałem, aby komórka zaznaczenia nie wyświetlała koloru podświetlenia tła, gdy go kliknę, ale wygląda na to, że Segue opiera się na tym, by działał przyzwoicie.

JAK USTAWIĆ: W scenorysie wybierz komórkę widoku tabeli w Nawigatorze i nie wybieraj opcji "Brak" w "Wybór" (Inspektor atrybutów). "Niebieski", "Szary" lub "Domyślny" wydaje się działać dobrze.

0

użytkowania

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

zamiast

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 

Następnie można pisać żadnego kodu i działa na pierwsze kliknięcie.

+0

Problem wydaje się być gdzie indziej. Może w scenorysie. Nie mogę się dowiedzieć ... Moja segue jest już raz wykonana w Storyboard, ale potrzebuje 2 kliknięć zamiast jednego (w moim widoku tabeli) w 75% przypadków. Czasami działa bardzo dobrze:/ – Tulleb

11

Już ustawiłem atrybut wyboru na "Domyślny" i nadal występował problem z dwoma kliknięciami. Ta sugestia wskazuje jednak na powiązane rozwiązanie. W didSelectRowAtIndexPath, zadzwoń:

self.tableView.deselectRowAtIndexPath(indexPath, animated: false) 

(Używam oczywiście Swift.)

+0

To wydaje się być dziwnym błędem, który wpływa tylko na Present Modally -> Cross Dissolve i Flip Horizontal. Twoje rozwiązanie działa idealnie Dzięki – Tom

+0

zmieniono to na '' 'self.tableView.deselectRow (at: indexPath, animated: false)' '' – reggie

+0

Tak! To jest rozwiązanie. Musisz odznaczyć wiersz, który wybrałeś. Opcja zaznaczenia w Storyboard nie ma na to wpływu. Dziękuję Ci. – pulp

0

FYI. do tej pory, z Xcode 8.2.1 i Swift 3.x, problem istnieje również dla mojej niestandardowej podklasy UICollectionViewCell (Ale przypuszczam, że podklasa nie jest potrzebna do odtworzenia tego problemu.) Nie mam czasu na przetestowanie tej sprawy.).

Podsumowuję tę kwestię jako: stuknięcie w poprzednio wybraną komórkę spowoduje pochłanianie zdarzenia dotknięcia, aby spowodować cofnięcie wyboru, zamiast oczekiwanego wywołania selekcji wyboru.

Rozwiązaniem jest, aby nie używać selekcji wyboru, powiedzmy, ale używać programowo wyzwalających kostek lub odznaczać samą komórkę za każdym razem, gdy wywoływana jest selekcja wyboru.