Swift 4.x и iOS 11.4.
Решение @gabbler все еще работает. ИДК, похоже, что это ошибка UIKit, но ..
Просто используйте:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.isHidden = true
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.navigationController?.navigationBar.isHidden = false
}
Что происходит, так это то, что 3-секундный код выполняется в потоке графического интерфейса пользователя, поэтому кнопка не имеет возможности обновиться, пока это не будет выполнено.
Чтобы решить эту проблему, запустите SwingWorker
для выполнения длительной операции; тогда вы по-прежнему сможете делать что-то в графическом интерфейсе, пока ждете этого.
Вот пара из руководств по этой теме и ] SwingWorker
Документы Javadoc, указанные выше, также содержат некоторый код.
public void actionPerformed(ActionEvent e) {
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
public Void doInBackground() {
// Call complicated code here
return null;
// If you want to return something other than null, change
// the generic type to something other than Void.
// This method's return value will be available via get() once the
// operation has completed.
}
@Override
protected void done() {
// get() would be available here if you want to use it
myButton.setText("Done working");
}
};
myButton.setText("Working...");
worker.execute();
}
Проблема в том, что ваша длительно выполняющаяся задача блокирует поток, который обычно рисует графический интерфейс.
Обычный способ обойти это - перебросить более длительную задачу в другой поток.
Это довольно просто сделать с помощью SwingWorker
.
Этот вопрос также может предоставить некоторую полезную информацию.