2014-02-18 2 views
1

Примечание: Я не говорю о SplitViews Master-Detail!Настройка главной страницы для сцен

Возникает вопрос, похожий на этот вопрос (Master page concept in Iphone development), но вопрос касается только стандартных функций, а не самой компоновки. Кроме того, ответы только показывают, как избежать дублирования кода, но вам все равно нужно связать IBActions на каждой сцене. Возможно, мы можем расширить связанный вопрос и найти несколько лучших решений :-)

Итак, я бы хотел определить главную страницу для всех сцен/контроллеров представления в моем приложении. Это обычная задача, например, в веб-разработке (т. Е. ASP.NET Masterpages).

Основная страница будет включать в себя фактический макет (цвет фона, где заголовок идет, где идет контент и т. Д.) И стандартные функции, присутствующие во всех сценах (открыть меню, вернуться, открыть страницу справки и т. Д.),

Использование интерфейса Builder (с или без раскадровки), что было бы лучшим способом для этого?

Вот мои идеи:

Вариант 1: Подкласс UIViewController для стандартных функций, CopyPaste общей компоновки в каждой сцене/ViewController.

Преимущества: Достаточно проста в использовании, просто скопируйте все элементы управления, установите родительский класс в IB и подключите стандартные кнопки функций.

Недостатки: утомительно, если у вас есть множество сцен, вы можете легко забыть подключить стандартные функции. Если по какой-либо причине мастер-макет меняется, вы ввернуты.

Вариант 2: Подкласс UIViewController, добавить макет программно-то в viewDidLoad, где вы также настроить событие нацеливает

Преимущества: И расположение и особенности обрабатываются в одном месте и легко изменчива.

Недостатки: вам необходимо настроить программный код, который несовместим, если вы используете IB везде. Вы не видите макет макета в IB, так что вы должны «представить» его там, когда настраиваете остальную часть сцены в IB. Без раскадровки вы можете использовать XIB только для разработки контента, но тогда у вас никогда не будет «целой картинки» в IB. Кроме того, это не работает с раскадровки.

Оба варианта не очень элегантны для меня. Каков ваш подход к этому (это должно быть общей проблемой!)?

ответ

1

Существует множество способов сделать это. Два из моих любимых способов следуют.

В обоих из них вы начинаете с (используя свой термин) MasterVC. Сделайте все макет и дизайн для общих элементов. Затем для contentView, либо:

  1. Включите отдельное представление и программно добавьте childViewControllers; или
  2. Поместите контейнер, содержащий UICollectionView. Создайте ячейку в коллекции, которая обрабатывает весь элемент коллекции. Создайте собственный класс ячеек с одним выходом (pageView, в моем примере) и загрузите ViewControllers из раскадровки одним из двух способов. Либо установите идентификаторы ваших VC на номера, которые представляют, где они будут отображаться в коллекции, или создадут массив имен VC. Затем всякий раз, когда пользователь переходит к определенному VC, вы указываете коллекцииVC прокручивать этот индекс.

Реализация в cellForItemAtIndexPath будет выглядеть примерно так:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    AMMasterCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath ]; 

    for (UIView *view in cell.pageView.subviews) 
     [view removeFromSuperview]; 

    NSString *viewID = self.arrayOfViewControllerNames[indexPath.item]; 

    AMMasterViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:viewID]; 
    AMMasterView *pageView = (AMMasterView *)viewController.view; 
    [cell.pageView addSubview:pageView]; 

    [self addChildViewController:viewController];     
    [viewController didMoveToParentViewController:self]; 

    return cell; 
} 

Я сделал это кучу раз, и он прекрасно работает.

+0

Ваша идея с UICollectionView умна. Однако в iOS5/6 есть UIContainerViews, которые, я думаю, делают именно то, что я хочу. UICollectionView привел меня туда, поэтому я принимаю ваш ответ. Благодаря! – JiaYow

0

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

Теперь я подумал об этом. Если все ваши взгляды имеют одинаковые элементы управления (маловероятно), вы можете создать один вид в раскадровке и создать его. В более логичном случае, когда они разделяют ряд элементов управления, и вы хотите стандартизировать их, у вас есть три варианта.

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

Я бы скорее всего выбрал вариант 2 и организовал его таким образом:

  1. Crea тая функция setupView установить стандартную конструкцию
  2. По мнению же нагрузку каждого вида, используя дизайн я бы назвал [whereEverYouPutThis setupView];

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

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