2013-03-18 30 views
10

Moja aplikacja ma kontroler widoku modalnego, w tym pasek wyszukiwania. Gdy pojawi się widok, chcę ustawić ostrość paska wyszukiwania. Próbowałem [self.searchBar becomeFirstResponder] w viewDidLoad, ale to nie zadziałało. Później umieściłem go w viewDidAppear, zadziałało. Ale z tym obejściem widoczne jest opóźnienie. (po pełnym wyświetleniu widoku klawiatura zaczęła się pojawiać)beFirstResponder działa w viewDidAppear, ale nie działa w viewDidLoad

Mogę zagwarantować, że zarówno viewDidAppear, jak i viewDidLoad zostały wywołane.

Co należy zrobić, jeśli chcę, aby pasek wyszukiwania był od razu skupiony na widoku?

(używam storyboard)

Obserwowani odpowiedź, próbowałem umieścić kod w viewWillLoad, ale nadal nie działa. (W viewWillLoad, self.searchBar.window jest zerowa)

+0

Gdzie uruchamiasz pasek wyszukiwania? –

+0

Czy próbowałeś umieścić [self.searchBar sięFirstResponder] w viewWillAppear? Jest wywoływana po viewDidLoad, ale gdy viewController nie jest widoczny, – Mikhail

+0

@roronoazorro: Używam StoryBoard. –

Odpowiedz

1

Zapis viewWillAppear instad z viewDidAppear/viewDidLoad.

Ponieważ viewWillAppear metoda jest wywołanie w czasie View pojawi (w procesie), aby uzyskać więcej informacji about viewWillAppear read this official Document.

- (void)viewWillAppear:(BOOL)animated 
{ 
    [self.searchBar becomeFirstResponder]; 
    [super viewWillAppear:animated]; 
} 
+0

Niestety to nie działa. –

+0

@ XhackerLiu- i putted kod po próbie w mojej aplikacji .. gdzie działa poprawnie :) – iPatel

+0

Dzięki. W mojej sytuacji w viewWillAppear "self.searchBar.window" jest nadal zerowe. Czy wiesz coś o tym? –

4

wszystkie obiekty IBOutlet załadowanych viewDidLoad, jeśli wywołanie metody w viewDidLoad wówczas, że działanie nie jest wykonywane, ponieważ przed obiekty są ładowane nie możemy niczego, co whybetter napisać ten kod w

-(void)viewWillAppear:(BOOL)animated{ 
//write here 
} 

zrobić to działa w porządku.

+0

Niestety to nie działa. –

5

Prawdopodobnie nie działa w viewDidLoad, ponieważ widok nie jest jeszcze dodany do widoku hierarchii. Ale zgodnie z dokumentacją jabłko becomeFirstResponder powinna nazywać się tylko na obiektach przyłączonych do UIWindow:

However, you should only call it on that view if it is part of a view hierarchy. 
If the view’s window property holds a UIWindow object, it has been installed 
in a view hierarchy; if it returns nil, the view is detached from any hierarchy. 

Tak, przypuszczam, najlepszym miejscem do osiągnięcia niezbędnej zachowanie jest umieszczenie zadzwonić do viewWillAppear metody.

Aktualizacja.

Tak więc, w świetle viewWillAppear sterownika jeszcze dołączone do UIWindow ... to tylko powiadomić, że widok zostanie dodany do wyświetlenia hierarchia

Być może niektóre trudne, ale można zrobić jakieś małe opóźnienie w viewWillAppear :

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    double delayInSeconds = 0.05; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^{ 
     make first responder here 
    }); 
} 

Ale wierzę, że to powinno być lepszym rozwiązaniem

+0

Po prostu próbowałem viewWillAppear, ale nadal nie działa. –

+1

Może podklasę widoku i przesłonię 'didMoveToWindow'? – Taum

2

Making pole tekstowe/widok pierwszy responder należy zrobić po wszystkich animacji UIViewController, które odbywają się, gdy widok jest ładowany przedstawione. Najlepszym miejscem jest viewDidAppear.

+0

"Uwaga: Przed przypisaniem obiektu do pierwszego obiektu sprawdzającego upewnij się, że aplikacja ustawiła swój wykres obiektów, na przykład, zwykle wywołujesz metodę becomeFirstResponder w override metody viewDidAppear: .Jeśli spróbujesz przydzielić pierwszą odpowiedź w viewWillAppear :, Twój wykres obiektowy nie został jeszcze ustalony, więc metoda beFirstResponder zwraca nr "- https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/event_delivery_responder_chain/event_delivery_responder_chain.html – mkirk

2

Pomoże:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.quantifyTextField becomeFirstResponder]; 
    }); 
} 
+0

Magiczne liczby i opóźnienia są po prostu złym pomysłem. –

+3

'dispatch_async (dispatch_get_main_queue(),^{[self.quantifyTextField getFirstResponder];});' –

+0

Inna opcja: 'NSOperationQueue.mainQueue(). AddOperationWithBlock {[textField] w textField.becomeFirstResponder()}' –

1

wiem, że to jest nieco stary wątek, ale myślę, że to może pomóc komuś, że jest jakiś problem z widokiem klawiatury po dodaniu tego kodu.

Pamiętaj, aby ustawić odstęp pola tekstowego na zero w widokuWysunięcie mapy, w przeciwnym razie klawiatura nie będzie wyświetlana ponownie, jeśli pop-view/dismiss kontroler widoku bez zamykania klawiatury.

Powiązane problemy