becomeFirstResponder works in viewDidAppear but doesn't work in viewDidLoad

后端 未结 7 1087
傲寒
傲寒 2021-02-13 04:49

My Application has a modal view controller, including a search bar. When the view comes up, I want the search bar to be focused. I tried [self.searchBar becomeFirstRespond

7条回答
  •  无人及你
    2021-02-13 05:20

    Possibly it does not work in viewDidLoad, as view does not added into view hierarchy yet. But according to apple documentation becomeFirstResponder should be called only on objects attached to 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.
    

    So, i assume, the best place to achieve necessary behavior is to place call into viewWillAppear method.

    Update.

    So, in viewWillAppear controller's view not yet attached to UIWindow... it only notify, that view will be added to view hierarchy

    It may be some tricky, but you can make some small delay in 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
        });
     }
    

    But I believe there is should be a better solution

提交回复
热议问题