Раскадровка в Xcode настолько медленная
У меня есть 150 UIViewController в Storyboard, и прокрутка между этими Views настолько медленная. Я не могу легко масштабировать и уменьшать масштаб, и для выполнения стилей требуется некоторое серьезное время.
Я на MBPR, и я установил Xcode 4.4
Spec: 2.3GHz/16G/256, который я считаю достаточным для обработки такой вещи.
Есть ли какие-либо опции, настройки или подсказки/трюки, чтобы иметь столько просмотров в раскадровке и не пропускать производительность.
ПРИМЕЧАНИЕ. Я выполнил все возможные решения (удаление кеша и рабочей области). Не работает. Это как-то связано с количеством UIViewController в раскадровке.
Спасибо
Обновление 2016. Просто обновите этот вопрос, так как есть новая функция в Xcode 7, которая позволяет вам реорганизовать раскадровку на несколько раскадровки.
Рефакторинг раскадровки
https://developer.apple.com/library/ios/recipes/xcode_help-IB_storyboard/Chapters/RefactorStoryboard.html
Если вы ищете термин "рефакторинг раскадровки", вы найдете хорошие учебники:)
Ответы
Ответ 1
Определенно используйте для этого несколько раскадровки. Я не знаю каких-либо ограничений в использовании раскадровки, но при попытке отобразить все эти коды пользовательского интерфейса в свое время сложно для вашей машины, и разработчикам также сложно понять.
Попробуйте логически объяснить ваши раскадровки в таких категориях, как: "profileSB, feedSB, mapSB, messagesSB, settingsSB"
Вот несколько хороших руководств по их созданию:
http://spin.atomicobject.com/2014/02/18/ios-storyboards-xcode5/
http://www.skillmasters.net/main/xcode-using-multiple-storyboards/
Ответ 2
Считается лучшей практикой разделить раскадровки на множество разных модулей (каждый в отдельной раскадровке). Это уберет эти проблемы производительности, которые у вас есть, а также имеет другие преимущества, такие как упрощение управления в целом (нет массивных конфликтов SVN и т.д.).
Однако у меня была еще одна проблема, которая вызывала отставание в раскадровке. У меня было около 25 контроллеров просмотра и получал ALOT задержки, но только когда Xcode работал на внешнем мониторе.
Я заметил, что если бы я отключил "автоматический макет" для раскадровки, отставание полностью исчезло бы. Я вернул это изменение, а затем выполнил следующий процесс:
-Удалить ViewController
-test, если он все еще отстает
-если все-таки laggy вернет изменения
В конце концов я нашел определенный ViewController, который, если удалил, остановил все задержки. Затем я вернул это и просмотрел взгляды, чтобы увидеть, какое представление вызвало задержку. В конечном итоге я сузил это до "UIButton" внутри "UIBarButtonItem". Я полагаю, что я изменил свойство "Тип" на кнопке, а затем изменил ее, и отставание остановилось. Из SVN кажется, что кадр был изменен в файле .storyboard. После этого момента отставание больше не возвращалось.
TL;DR:
Задержка раскадровки не всегда, потому что у вас слишком много предметов в раскадровке. Мне удалось избавиться от проблемы с задержкой, заставив Xcode повторно выполнить некоторую компоновку.
Надеюсь, мой опыт поможет кому-то еще диагностировать/решать свои проблемы. Я работал около 0,5 года, прежде чем я, наконец, очень разозлился и попытался решить проблему.
Ответ 3
150 ViewControllers в одной раскадровке звучат для меня ужасно.
Постарайтесь минимизировать поток или разбить на несколько раскадровки, если вам действительно нужно так много
Ответ 4
У меня был UIStoryboard
с 10 или более UIViewControllers
и дополнительными ContainerViews
. После компоновки представлений и настройки все больше, UIStoryboard
стало все более и более ленивым.
Мой подход заключался в настройке представлений внутри одного UIStoryboards
. Загрузка контроллеров выполняется в моем Меню, где я устанавливаю NSArray
со всеми идентификаторами для UIViewController
, которые также должны быть настроены внутри UIStoryboard
:
![enter image description here]()
При загрузке меню я прохожу через NSArray
и загружаю UIViewControllers
по идентификаторам из определенного UIStoryboard
. Это место, где мне нужно было реализовать переключатель для разных UIStoryboards
:
self.arrayVCAll = [NSMutableArray new];
for ( NSArray *array in _arrayViewControllerAll ){
NSMutableArray *arrayTemp = [NSMutableArray new];
for (UIViewController *vc in array ){
NSString *strViewController = [NSString stringWithFormat:@"%@", vc];
UIStoryboard *storyboard;
if( [strViewController isEqualToString:@"CustomOneStoryboard"] ){
storyboard = [UIStoryboard storyboardWithName:@"FirstVC" bundle:nil];
} else if( [strViewController isEqualToString:@"CustomTwoStoryboard"] ){
storyboard = [UIStoryboard storyboardWithName:@"SecondVC" bundle:nil];
} else {
storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
}
UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:strViewController];
MyNavController *nav = [[MyNavController alloc] initWithRootViewController:controller];
[arrayTemp addObject:nav];
}
[self.arrayVCAll addObject:arrayTemp];
}
В моем случае возникла проблема с segues после разделения начального UINavigationController
на my UIViewControllers
. Сегеты не будут нажимать на навигационный контроллер, если нет начального UINavigationController
. Вот почему я добавил UINavigationController
для каждого UIViewController
(моего NSArray), поэтому UIStoryboardSegue
будет выполнен правильно. UINavigationController
также не нужно подключать к классу, просто включите его внутри UIStoryboard
и подключите его к первому UIViewController
.