2

У меня есть UIView («content»), представляющий собой белый вид с большой красной точкой.viewDidAppear, но также и когда приложение возвращается с фона

Когда приложение запускается, я хочу, чтобы точка исчезла (всего полсекунды).

Всякий раз, когда эта точка зрения появляется снова (так, пользователь был на каком-то другом экране и возвращается к этому экрану), я хочу, чтобы точка стираться в.

Нет проблем до сих пор

override func viewDidAppear(animated: Bool) 
    { 
    content.fadeIn() 
    } 

Однако всякий раз, когда приложение переходит в фоновый режим, когда пользователь вводит его на передний план (при условии, что вид показывает) Я хочу, чтобы это выгорает. Я делаю это

func weAreActive(notification: NSNotification) {content.fadeIn()} 
func weAreNotActive(notification: NSNotification) {content.alpha = 0;} 

override func viewWillAppear(animated: Bool) 
    { 
    super.viewWillAppear(animated) 
    NSNotificationCenter.defaultCenter().addObserver(
     self, selector: #selector(weAreActive(_:)), 
     name: UIApplicationDidBecomeActiveNotification, object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(
     self, selector: #selector(weAreNotActive(_:)), 
     name: UIApplicationDidEnterBackgroundNotification, object: nil) 
    } 

override func viewDidDisappear(animated: Bool) 
    { 
    super.viewDidDisappear(animated) 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

Первый выпуск: Меня беспокоит использование viewWillAppear/viewDidDisappear пары для регистрации/отмены регистрации. Я ошибаюсь? Должен ли я использовать другую пару - возможно, viewDidAppear/somethingElse? Или?

Второго выпуск: Я беспокоюсь о том, как viewDidAppear и «weAreActive` срабатывает одновременно (возможно, когда приложение первое запускает, например)

кажется безвкусным. Есть ли лучший способ поиска «этот взгляд действительно появляется» с причинами, включая все запуск, пробуждение и обычный viewDidAppear?

+1

Я бы предпочел вместо этого 'viewDidAppear' и' viewWillDisappear'. На самом деле нет лучших событий. В большинстве случаев вам не нужно менять пользовательский интерфейс, когда вы возвращаетесь с фона. Пользователи обычно хотят работать как можно быстрее, и иногда они могут видеть скриншот предыдущего пользовательского интерфейса, принятого системой, поэтому анимация не является хорошим решением. – Sulthan

+0

Привет @Sulthan, спасибо, в чем причина (ы), которую вы предпочитаете 'viewDidAppear' и' viewWillDisappear' для регистрации/незарегистрирования? – Fattie

+0

Для этого уведомления это, вероятно, не имеет значения, но обычно я не хочу получать уведомления, когда представление появляется или исчезает, поэтому я бы предпочел 'viewDidAppear'. – Sulthan

ответ

1

Первый выпуск: viewDidAppear и viewDidDisappear бы лучшие места для регистрации/Разрегистрируйте уведомления, по той причине, вы изложенных в вашем втором вопросе (на первом запуске, регистрации UIApplicationDidBecomeActiveNotification в viewWillAppear вызовет дубликат анимации.

Edit: Если вы просто проверить, когда приложение возвращается из фона, то вы должны использовать UIApplicationWillEnterForegroundNotification, то вы можете использовать viewDidAppear или viewWill Появляются, не беспокоясь о повторяющихся звонках.

viewDidAppear и viewWillDisappear были бы лучшими местами для запуска анимации, чтобы пользователь мог их увидеть.

Вторая проблема: viewDidAppear/viewWillAppear не вызывается, когда приложение возвращается из фона, поэтому вам не нужно беспокоиться о том, что оба они вызываются одновременно.

В некоторых сценариях было бы неплохо иметь общий «viewHasDefinitelyAppeared», но есть немало случаев, когда вы хотели бы, чтобы они были раздельными, не все приложения хотят, чтобы пользователи видели анимацию, когда они возвращаются из фона, который не был бы возможно, если все методы объединены в один.

+0

Нет проблем Джо, (1) в вашем примере кода. Я бы сказал, что у вас есть это самый разумный способ. Если вы собираетесь отображать анимацию каждый раз, когда пользователь покидает представление, я бы предложил положить это в ** Will ** исчезнуть. Ваша незарегистрированность уведомления имеет смысл быть последней, что происходит. (2) Я считаю, что вам не нужно беспокоиться о том, что никто из них не будет вызван. Если их не вызывают, это проблема с Apple. Все 4 должны вызываться при отображении экрана или нет. Я слышал, что вы говорите о лучшей паре, но на самом деле это зависит от того, что вам нужно делать. – darrenallen7

+0

(i) Не жалко, у меня нет документа Apple для этого, и он несколько раз сталкивался с этой проблемой, задаваясь вопросом, почему мой viewDidAppear не работает, когда я переключаюсь обратно в свое приложение. (ii) Я думаю, вы будете здесь в безопасности, потому что viewWillAppear не будет вызван достаточно рано, чтобы зарегистрировать уведомление для первого запуска. Я просто настраиваю тест, чтобы подтвердить это, но я не думаю, что вам нужно беспокоиться о двойном вызове. – darrenallen7

+0

Я стою исправлено, viewWillAppear называется достаточно ранним и вызывает уведомление, которое вызывается в начале. Я собираюсь отредактировать свой ответ соответственно. – darrenallen7