2012-07-27 4 views
11

У меня есть 150 UIViewController в раскадровке и прокрутка между этими видами настолько медленная. Я не могу легко увеличивать и уменьшать масштаб, и для выполнения стилей требуется некоторое время.Раскадровка в Xcode настолько медленная

Я на MBPR и я установил Xcode 4,4

Spec: 2.3GHz/16G/256, который я думаю, что этого достаточно, чтобы справиться с такой вещи.

Есть ли какие-либо опции, настройки или подсказки/уловки, чтобы иметь так много просмотров в раскадровке и не пропустить производительность.

ПРИМЕЧАНИЕ. Я выполнил все возможные решения (удаление кеша и рабочего пространства). Не работает. Это как-то связано с количеством UIViewController в Storyboard.

Благодаря

Update 2016: Просто чтобы обновить этот вопрос, поскольку есть новая функция в Xcode 7, которая позволяет реорганизовать раскадровки в нескольких раскадровки.

Рефакторинг Storyboards https://developer.apple.com/library/ios/recipes/xcode_help-IB_storyboard/Chapters/RefactorStoryboard.html

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

+0

Вы уже решили свою проблему? Может быть, вы можете отметить правильный ответ –

+0

oh my bro !!, 150 vc, чувствуя боль: -s –

ответ

6

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

Try логически предугадывать раскадровки в таких категориях, как: "profileSB, feedSB, mapSB, messagesSB, settingsSB"

Вот некоторые хорошие учебники по созданию этих:
http://spin.atomicobject.com/2014/02/18/ios-storyboards-xcode5/
http://www.skillmasters.net/main/xcode-using-multiple-storyboards/

+0

Чтобы выполнить этот ответ в более новой версии Xcode, рефакторинг раскадровки https://developer.apple.com/library/ios/recipes/xcode_help-IB_storyboard/Chapters/RefactorStoryboard.html – Maziyar

3

150 ViewControllers в одном раскадровке звучит очень много для меня. Постарайтесь свести к минимуму поток или разбить на несколько раскадровки, если вам действительно так нужно

+1

Привет, товарищ, звучит ужасно, но есть ли ограничения в использовании раскадровки? Дело в том, что нет ничего о том, сколько просмотров может быть в раскадровке. Я прочитал их все, и их не было. Я пытался уменьшить их и динамически отображать контент, но это не для меня, клиент сделал это раньше, и я просто делаю некоторые крупные обновления. Я просто спросил из любопытства, чтобы увидеть, есть ли какие-либо советы/трюки вокруг или даже ограничения. Спасибо за ответ. И не думал о расщеплении на две Раскадровки. Благодарю. – Maziyar

1

У меня был 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]; 
} 

В моем случае была только проблема с перетекает после отделения начального UINavigationController от моего UIViewControllers. Сегеры не будут нажимать на навигационный контроллер, если нет начального UINavigationController. Вот почему я добавил UINavigationController на каждый UIViewController (моего NSArray), так что UIStoryboardSegue будет выполнен правильно. UINavigationController также не нужно подключать к классу, просто включите его внутри UIStoryboard и подключите его к первому UIViewController.

7

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

Однако у меня была еще одна проблема, которая вызывала отставание в раскадровке. У меня было около 25 контроллеров просмотров и получалось ALOT от запаздывания - но только когда Xcode работал на внешнем мониторе.

Я заметил, что если бы я отключил «автоматический макет» для раскадровки, отставание полностью исчезло бы. Я вернулся это изменение, а затем последовал следующий процесс: -Delete ViewController -test, если он по-прежнему отстает от -ел все еще меняется лаг Revert

В конце концов я нашел некоторую ViewController который, если удалена остановленную все лаг. Затем я вернул это и просмотрел взгляды, чтобы увидеть, какое представление вызвало задержку. В конечном итоге я сузил это до «UIButton» внутри «UIBarButtonItem». Я полагаю, что я изменил свойство «Тип» на кнопке, а затем изменил ее, и отставание остановилось. Из SVN кажется, что кадр был изменен в файле .storyboard. После этого момента отставание больше не возвращалось.

TLDR: Отрыв раскадровки не всегда, потому что у вас слишком много предметов в раскадровке. Мне удалось избавиться от проблемы с задержкой, заставив Xcode повторно выполнить некоторую компоновку.

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

+0

Tnx mate, это хороший совет, чтобы иметь в виду :) – Maziyar

+0

Бинго! У меня была невероятная медлительность, и у моей раскадровки было всего 7 контроллеров. Два из VC имели UIButton в BarButtonItem. Я удалил эти кнопки и мгновенную скорость. Теперь я знаю причину, чтобы найти решение ... – Swany

+0

Эй, @Swany, как я сказал в своем посте, я как бы удалил их и снова добавил, и он сбросил рамки, которые остановили безумное отставание. Попробуйте повторно добавить их, это может сработать для вас. –

Смежные вопросы