Переходы раскадровки и получение предупреждения о памяти

Я разрабатываю приложение с помощью SDK на базе iOS 9, я впервые работаю с раскадровками, у меня есть 20 контроллеров представления, каждая сцена имеет кнопки «Далее/Предыдущая» для перехода назад и вперед. У меня огромная проблема с продвижением вперед!. Если я перехожу от сцены 1 к, например, сцене 15, я получаю предупреждение о памяти, а затем происходит сбой приложения. Я искал, и кажется, есть метод под названием unwind segue, но кажется, что это для возврата! это что-то вроде метода dissMiss.

Я соединяю каждую сцену линией в Interface Builder:

введите здесь описание изображения

Вот настройка segue:

введите здесь описание изображения

Буду признателен, если вы мне поможете.

ОТРЕДАКТИРОВАНО:

Я попытался представить контроллер представления программно, но результат был тот же! .

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    WhatIsDino *vc = (WhatIsDino*)[mainStoryboard instantiateViewControllerWithIdentifier:@"WID"];
    [self presentViewController:vc animated:YES completion:nil];

person Mc.Lover    schedule 26.09.2015    source источник
comment
Появляется ли предупреждение о памяти при первом переходе от 1 к 15 или оно начинает появляться немного позже?   -  person Abubakr Dar    schedule 26.09.2015
comment
Переходы раскадровки никогда не должны указывать на предыдущую сцену. Вместо этого отклоните представленный контроллер представления. Самый простой способ сделать это — раскрутить переход.   -  person jlehr    schedule 26.09.2015
comment
Память @AbubakrDar будет занята после показа каждой сцены.   -  person Mc.Lover    schedule 26.09.2015
comment
@jlehr Они все связаны друг с другом! Я не знаю, что мне делать!   -  person Mc.Lover    schedule 26.09.2015
comment
Не используйте переходы для перехода назад. Это не правильно. Удалите обратные переходы.   -  person Fogmeister    schedule 27.09.2015
comment
@Fogmeister назад - не моя проблема, я удалю их, хорошо! А форварды?   -  person Mc.Lover    schedule 27.09.2015
comment
Подождите... У вас есть 20 различных представлений с кнопками "Далее" и "Назад"?!   -  person Fogmeister    schedule 27.09.2015
comment
Вам нужно использовать что-то вроде контроллера представления страницы и иметь один контроллер представления, который используется для всех страниц.   -  person Fogmeister    schedule 27.09.2015
comment
@Fogmeister да, я не могу, каждая страница имеет свое содержимое и данные, я не могу смешивать их в одном коде и просматривать!   -  person Mc.Lover    schedule 27.09.2015
comment
Это именно то, что вы должны сделать. Сколько разных классов String было бы, если бы каждый из них мог отображать только одну строку? Сделайте свой контент свойством контроллера представления, которое передается во время выполнения. Вы должны начать с базового учебника. Вы подходите к этому очень неправильно и плохо. Вопрос здесь не совсем уместен. Проблема не имеет ничего общего с какими-либо переходами или чем-то еще. Проблема, с которой вы столкнулись, связана с отсутствием понимания и знаний о том, как писать приложения. Начните с самого начала. Узнайте о принципах oop.   -  person Fogmeister    schedule 27.09.2015


Ответы (3)


Похоже, проблема в неправильном подходе, а не в раскадровке.

Позвольте мне угадать, так как до раскадровки вы использовали, чтобы изменить rootViewController вашего приложения на следующий/предыдущий экран, как только вы нажмете на кнопку со стрелкой. Таким образом, предыдущий экран освобождается и освобождается из памяти, как только вы устанавливаете новый rootViewController.

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

Что ж, вы также можете использовать rootViewController подход с раскадровкой, так как это просто еще один способ управления вашими экранами во время разработки. Раскадровка предлагает дополнительные функции, такие как переходы, статические ячейки представления таблицы, общий оттенок цвета и так далее. [UIStoryboard -instantiateViewControllerWithIdentifier:] это метод, который может вас заинтересовать.

Но я бы рекомендовал вам проверить UIPageViewController, это как контейнер для экранов. К сожалению, он не может иметь переходы к вашим сценам (из-за особого способа работы переходов), поэтому вам все равно придется использовать метод -instantiateViewControllerWithIdentifier:. Вы можете обращаться с контроллерами внутреннего представления UIPageViewController так же, как и с rootViewController раньше.

person ReDetection    schedule 26.09.2015
comment
Извините, я просто изменил модальный переход с перехода на программный, но результат тот же! ! ! у вас есть пример кода или что-то? - person Mc.Lover; 26.09.2015
comment
Используя этот код (проверьте мой отредактированный вопрос) и тот же результат - person Mc.Lover; 26.09.2015
comment
Да, результат действительно будет таким же — ваш код делает в основном то же самое, что и segue. Вместо этого вы должны использовать подход UIPageViewController или вернуться к подходу rootViewController (последнее не является хорошим решением). Используйте метод - setViewControllers:direction:animated:completion: на контроллере просмотра страницы для обновления экранов — вместо последней строки. Учебников в инете предостаточно. Пройди этот. Вы можете игнорировать настройку делегата appcoda.com/uipageviewcontroller-storyboard-tutorial. - person ReDetection; 27.09.2015
comment
Спасибо теперь работает нормально! Я все еще получил предупреждение о памяти (не уверен, что кеш или что-то еще), но после получения этого сообщения ОЗУ очистится, а затем будет работать нормально. - person Mc.Lover; 27.09.2015
comment
Для вашего дальнейшего прогресса: ознакомьтесь с этим проектом, они сделали специальный переход для работы с UIPageViewController напрямую из раскадровки. github.com/theothertomelliott/TEQuickPageViewController И Fogmeister прав — исследуйте, как вы можете унифицировать свои экраны. - person ReDetection; 28.09.2015
comment
Не могли бы вы помочь мне с этим? stackoverflow.com/questions/32871462/ - person Mc.Lover; 03.10.2015

Вы также можете перемещаться без перехода, и я думаю, что это простой способ.

Если вы хотите перейти от класса 1 к классу 2, выполните следующие действия.

1) В классе 1 импортируйте класс 2.

2) В вашей кнопке Action напишите этот код.

Class2 *next = [self.storyboard InstantiateViewControllerWithIdentifier:@"Имя идентификатора класса 2"]; [self.navigationController pushViewController: следующий анимированный: YES];

Не забудьте указать имя идентификатора в раскадровке, которое является «идентификатором раскадровки» в инспекторе атрибутов определенного класса.

Не нужно добавлять Segue, ваша раскадровка будет выглядеть чистой.

person Amit Ajmera    schedule 26.09.2015
comment
Безуспешно, вызывает те же проблемы - person Mc.Lover; 26.09.2015
comment
В одном из моих случаев это сработало для меня! Возможно, вам придется пойти с другим решением. Удачи! - person Amit Ajmera; 27.09.2015

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

Использование навигационного контроллера и push также накладывает контроллеры представления друг на друга.

У вас возникнет эта проблема, если вы используете раскадровки, перья или создаете контроллеры представления вручную.

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

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

person Duncan C    schedule 26.09.2015
comment
Спасибо ! Я думаю, что мне нужно изменить пользовательский интерфейс и сделать меню! Или что-то вроде этого - person Mc.Lover; 27.09.2015