2012-07-03 14 views
9

Mam UITableViewController z zgrupowanym statycznym UITableView. Definiuję komórki dla mojego statycznego widoku tabeli w scenorysie. Jedna z komórek ma pole tekstowe. Po wywołaniu tego pola tekstowego pojawia się klawiatura, jednak widok tabeli nie zmienia się automatycznie tak jak zwykle w kontrolce widoku tabeli. Teraz klawiatura częściowo zakrywa pole tekstowe i nie mogę przewijać w górę.Klawiatura UITableViewController i UITextField

Rozumiem, że podczas korzystania z kontrolki UITableViewController i widoku table, widoczna powierzchnia powinna automatycznie zmniejszać się po wywołaniu klawiatury. Działa w sposób zamierzony w innych częściach mojej aplikacji, po prostu nie w tym statycznym widoku tabeli. Czy to nie działa z tabelami statycznymi? Czy jest coś jeszcze, czego mi brakuje? Czy istnieje prosty sposób rozwiązania tego problemu?

Dzięki

+0

Można też przesunąć widok w górę lub ręcznie zmienić jego rozmiar. – Dustin

+1

Pytanie brzmi, dlaczego nie robi tego automatycznie, gdy robi to normalnie? – Keith

+0

Prawdopodobnie dlatego, że używasz statycznego widoku tabeli (jak zgadłeś). Statyczne widoki tabel zostały specjalnie zaprojektowane, aby się nie zmieniały - i dlatego nazywa się je "statycznymi". – Dustin

Odpowiedz

48

Odpowiedź

To nie ma nic wspólnego z komórkami statycznych. Powinny działać.

Jeśli kontroler jest już kontrolerem UITableViewController, sprawdź, czy użyto metody: viewWillAppear. Jeśli tak, musisz zadzwonić pod numer [super viewWillAppear:YES], aby zadziałało "automatyczne zachowanie".

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:YES]; // This line is needed for the 'auto slide up' 
    // Do other stuff 
} 

Ten problem pojawia się łatwo, ponieważ kod boilerplate dla kontrolerów nie pochodzą z wezwaniem viewWillAppear metody i jeśli zdefiniować go w kontrolerze, zastąpić go.

dodatkowych informacji

Spójrz na ten link.

Apple Table View Programming Guide

Uwaga: UITableViewController ma nowe możliwości w iOS 3.0. Kontroler tabelaryczny obsługuje bezpośrednią edycję wierszy widoku tabeli; Jeżeli na przykład wiersze zostały osadzone pól tekstowych w trybie edycji, to przewija wiersz edytowany nad klawiaturą wirtualną, która jest wyświetlanego .... bla ....

Ważną nieco

Klasa UITableViewController wykonuje zachowania poprzedzającego nadrzędne loadview, viewWillAppear :, i innych metod odziedziczone z UIViewController. W swojej podklasie UITableViewController możesz również zastąpić te metody, aby uzyskać wyspecjalizowane zachowanie.Jeśli wykonasz nadpisanie tych metod, należy wywołać implementację metody nadklasy , zwykle jako pierwsze wywołanie metody, aby uzyskać domyślne zachowanie .

+0

Dowiedziałem się niedługo po tym, jak napisałem tutaj, że nie ma to nic wspólnego ze statycznym stołem. Stworzyłem tabelę statyczną testu i działało dobrze, więc wiedziałem, że to jest coś z moim kodem. Masz 100% racji. To był [super viewWillAppear: YES] ;. Jak tylko dodałem to do mojego viewWillAppear to działało. Chyba trochę jak został usunięty. Obawiałem się naprawić w tym tygodniu i okazało się to naprawdę łatwe. Dzięki – Keith

+1

Pozdrawiam człowieka. Twoje pytanie skierowało mnie do doktorów, a ja nauczyłem się kolejnego gotcha =) –

+1

Świetna odpowiedź, skandaliczna, że ​​nie miałeś więcej głosów. I tak jest. –

0

Odkłada widok w górę, jeśli jest wybrany do edycji jedną z form stołowych (wymaga implementacji powiadomienia klawiatury)

- (void) keyboardDidShow:(NSNotification *)aNotification 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.25]; 
    self.view.center = CGPointMake(self.view.center.x, self.view.center.y-moveAmount); 
    [UIView commitAnimations]; 
    isRaised = [NSNumber numberWithBool:YES]; 
} 

Zmienia rozmiar tabeli (wysokość dzieli przez 2). Zamień to na klawiaturę, która pokazała metodę. Możesz także użyć klawiatury, aby ukryć tę metodę.

CGRect temp = CGRectMake(mineTable.frame.origin.x, mineTable.frame.origin.y, mineTable.frame.size.width, mineTable.frame.size.height/2); 
mineTable.frame = temp; 
+1

Czy to pełna odpowiedź? Wydaje się, że niektórych rzeczy brakuje. – Keith

+0

Cóż, nie chciałem ci pokazać kilku rzeczy, które już znasz. Powiedziałem ci, co robić (wdrażanie powiadomień klawiatury). To tylko przykładowy kod wskazujący ci właściwy kierunek. – Dustin

1

Dla Swift

override func viewWillAppear(animated: Bool) { 

    super.viewWillAppear(animated) 

} 
Powiązane problemy