Создание экземпляра контроллера модального представления замораживает приложение - вероятная проблема с Xcode 7

Я модально представляю контроллер представления в приложении iOS. Проблема в том, что сбоя не происходит, и приложение зависает, как только вызывается presentViewController:animated. Статистика показывает, что загрузка ЦП составляет 100%, и загрузка не снижается даже после закрытия приложения вручную.

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
CustomModalViewController *vvc = [sb instantiateViewControllerWithIdentifier:@"CustomModalViewController"];
if(!vvc){
    NSLog(@"ERROR!!! vvc is null");
}
NSLog(@"instantiate modal view controller");

vvc.providesPresentationContextTransitionStyle = YES;
vvc.definesPresentationContext = YES;
vvc.data = data;
NSLog(@"before presenting modal view controller");
[vvc setModalPresentationStyle:UIModalPresentationOverCurrentContext];
[self presentViewController:vvc animated:YES completion:nil];

Я попытался напечатать некоторые операторы отладки в viewDidLoad моего пользовательского класса, но они также не вызываются.

Я не понимаю, почему контроллер представления не отображается. Любая помощь будет оценена. Я хочу знать, в каком случае ваше приложение переходит в бесконечный цикл при нажатии на контроллер представления или это происходит по какой-то другой причине?

ОБНОВИТЬ:

Эта ошибка возникла после того, как я обновился до XCode 7. Не уверен, но предполагаю, что это может быть проблема с новым SDK — компилятором UIKit или LLVM. Я скопировал свой проект на другой Mac с Xcode 6.4, и ошибка исчезла!!! Я также не изменил никаких настроек сборки, которые могли бы вызвать проблему.

Любые указатели на то, как действовать?


person Ajax    schedule 23.09.2015    source источник
comment
Вы хотите прозрачный фон после представления другого контроллера представления?   -  person Mukesh    schedule 23.09.2015
comment
да. Я также хочу показать фоновый вид.   -  person Ajax    schedule 23.09.2015
comment
это не сработает ma den.u, возможно, придется написать собственный переход, чтобы сделать фон полупрозрачным   -  person Mukesh    schedule 23.09.2015
comment
Я также пробовал UIModalPresentationPopover. получить ту же проблему. Любая идея, почему это может произойти ?? Если бы произошел сбой, я мог бы хотя бы изучить трассировку стека.   -  person Ajax    schedule 23.09.2015
comment
если вы хотите, чтобы я поделился здесь примером, чтобы сделать прозрачный фон.   -  person Mukesh    schedule 23.09.2015
comment
Откуда вы вызываете этот код в представленном контроллере? Скорее всего, это проблема с представленным контроллером. Попробуйте получить доступ к новому представлению контроллеров, прежде чем представлять его, и посмотрите, не зависнет ли оно. let view=vvc.view заставит viewDidLoad вызываться на vvc. Если теперь он зависает на этой строке, ваша проблема в CustomModalViewController. Вероятно, в его viewDidLoad. Вы также можете приостановить отладчик и посмотреть, где он находится в трассировке стека.   -  person Rory McKinnel    schedule 23.09.2015
comment
Он зависает на этой строке, поэтому проблема, похоже, в customModalViewController. Но я добавил оператор печати в первую строку в viewDidLoad, и он не выполняется. Я обновлю, запустив timeProfiler и получив представление о том, какой метод застрял в бесконечном цикле.   -  person Ajax    schedule 23.09.2015
comment
Его рекурсивный вызов initWithCoder в UIViewController loadViewIfRequired.   -  person Ajax    schedule 23.09.2015
comment
Стоит проверить, как вы определили CustomModalViewController. Убедитесь, что вы установили этот класс только для контроллера представления, а не для его основного вида и т. д. Похоже, вы создаете его, и при его создании он создает другой и так далее.   -  person Rory McKinnel    schedule 23.09.2015
comment
Увидел ваше обновление. Вы пытались удалить приложение, выполнить чистую сборку, полную сборку, а затем запустить ее, если что-то не так с установкой приложения.   -  person Rory McKinnel    schedule 24.09.2015
comment
Да, я пробовал очистить и построить. Удалил приложение с устройства, а потом установил. На данный момент я перешел на Xcode 6.4. Я попытаюсь воспроизвести ошибку в другом проекте и опубликую ссылку на github, чтобы другие могли ее попробовать.   -  person Ajax    schedule 24.09.2015
comment
@Ajax .. Да, у меня была такая же проблема ранее в Xcode 6.4, она работала отлично, но по мере обновления Xcode его пользовательский интерфейс зависает, а загрузка ЦП составляет 100%, см. МОЙ ПОСТ здесь   -  person Rahul Shirphule    schedule 28.09.2015


Ответы (3)


Хорошо, это странно, но я надеюсь, что это поможет: у меня ТОЧНО такая же проблема, ЦП скачет до 100%, и представление никогда не отображается. Отлично работает в Xcode 6.4. В Xcode 7.1 в представлении, которое я вызываю, у меня есть UITextView с некоторым текстом-заполнителем «Примечания:». Я обнаружил, что если я удалю текст-заполнитель, представление LOADS и все процедуры будут выполняться как обычно. Если длина текста заполнителя превышает 9 символов, представление также загружается, и процедуры выполняются как обычно. Если длина текста заполнителя > 0 и ‹ 10, это не годится. Нет просмотра и CPU на 100%. Это странно, я понимаю, но, надеюсь, это поможет вам. Как и у вас, у меня нет ошибок или вывода консоли, чтобы показать, он просто вращается.

РЕДАКТИРОВАТЬ К вашему сведению, скрытие текста-заполнителя в раскадровке и просто установка его в коде также исправляет это, независимо от длины.

person CodeNoob    schedule 12.10.2015
comment
Святые дымы, вот и все! Я пробовал так много вещей, и это было оно. То же самое, Xcode 7.1, UITextView, где у меня была копия-заполнитель на раскадровке, и я устанавливал ее в своем контроллере представления. Решение для меня состояло в том, чтобы просто очистить текст от раскадровки и установить его только в коде. Это объясняет, почему он застревает в цикле NSString isEqualToString, вроде :) - person Will; 14.10.2015
comment
Это не дает первопричины, но я все равно принимаю это!!! В моем случае тоже сработало.. - person Ajax; 15.10.2015
comment
пожалуйста, найдите подходящее имя для этого вопроса. оно перенаправляет людей на этот вопрос и решение для другого вопроса - person Muhammad Asyraf; 09.03.2020
comment
У меня есть проект, который раньше был в Swift 3 и Xcode 8.3. Теперь мне пришлось переключиться на Xcode 11, и некоторые контроллеры не отображаются при представлении. Процессор и память увеличиваются, и экран зависает без ошибок. Но я не вижу никаких UITextViews. Любые другие причины? - person PoolHallJunkie; 02.05.2020

Та же проблема здесь.

У меня есть UITextView со строкой по умолчанию «Текст», и он не работает со 100% загрузкой ЦП. Я помещал заполнитель только в код, но пока я не удалю «Текст» из раскадровки, это не сработало.

Мой код был разработан в Xcode 6, и я заметил эту ошибку после отправки новой версии приложения, созданной с помощью xcode 7.

person Hexmit    schedule 19.10.2015

У меня была точно такая же проблема, как описано в ОП и ответах:

  1. Представьте контроллер представления (в моем случае PageViewController)
  2. Представленный контроллер представления имеет кнопку, которая при нажатии представляет другой контроллер представления для добавления заметки.
  3. Переместите приложение на задний план, пока представлен контроллер представления «заметка». Затем верните его на передний план.
  4. Приложение сейчас заморожено. При подключении к отладчику вроде зависает на неопределенный срок, но при запуске в проде вылетает. Процессор был загружен на 100%, а использование памяти росло.

В конечном итоге я отследил это до того, что мое представление «Заметка» было установлено в качестве первого ответчика. Когда мое представление появляется через override func viewWillAppear(_ animated: Bool), я устанавливаю заметку UITextView, чтобы она стала первым ответчиком, noteTextView.becomeFirstResponder().

Если бы я удалил эту строку и никогда не касался поля заметки, мое приложение успешно возобновило бы работу в фоновом режиме.

Чтобы решить эту проблему, я добавил наблюдателей, когда приложение перемещается на задний план и перемещается на передний план. В этих обозревателях я делаю текстовое представление заметки становящимся и отменяющим firstResponder соответственно.

    override func viewDidLoad() {
        super.viewDidLoad()
        //set up your view controller here. 

        NotificationCenter.default.addObserver(self, selector: #selector(self.appMovedToForeground), name: UIApplication.willEnterForegroundNotification, object: nil)

        NotificationCenter.default.addObserver(self, selector: #selector(self.appMovedToBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
    }

    @objc func appMovedToForeground() {
        self.noteTextView.becomeFirstResponder()
    }

    @objc func appMovedToBackground() {
        self.noteTextView.resignFirstResponder()
    }

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

person Neil Poulin    schedule 05.02.2020