Подтвердить что ты не робот

Раскадровка в 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

Если вы ищете термин "рефакторинг раскадровки", вы найдете хорошие учебники:)

4b9b3361

Ответ 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.