2016-03-06 6 views
0

Скажем, у меня есть приложение с фиксированным расположением: одна кнопка и несколько ярлыков. Имеет смысл не использовать несколько контроллеров просмотра во всем приложении, так как у меня есть одна и та же кнопка и метки. Я не хочу копировать и вставлять их, потому что их внешний вид и стиль никогда не будут меняться. Если позже я решит изменить их внешний вид, мне придется пройти через каждый контроллер вида, и это плохая практика (как и при копировании и вставке кода).Структура приложения iOS

Хотя, я хочу, чтобы иметь возможность позволить пользователю вернуться назад и вперед «макеты» приложение, но этот код не позволяет мне сделать это:

class MyViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     enterFirstLayout() 
    } 

    func enterFirstLayout() { 
     // do things such as change labels' text property 
     exitFirstLayout() 
    } 

    func exitFirstLayout() { 
     // do things 
     enterSecondLayout() 
    } 

    func enterSecondLayout() { 
     // ... 
    } 
} 

Что я могу сделать, чтобы избежать создания несколько контроллеров просмотра и предоставление пользователю возможности пропустить и вернуться к определенному макету приложения?

+1

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

+0

Это очень интересно, спасибо @jtbandes. Что делать, если один макет немного отличается от других? Скажем, мне нужно вызвать функцию только в одном макете, а не в других. – Cesare

+0

Вопросы, которые вы задаете, слишком расплывчаты для хороших ответов. Это может быть не 100% актуально для вашей проблемы, но я бы рекомендовал изучить дизайн [ResearchKit] (http://researchkit.org/docs/index.html), который имеет концепцию «шагов» и «задач», которые может иметь некоторое сходство с тем, что вы делаете. – jtbandes

ответ

2

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

В этом случае я бы использовал UICollectionView с UICollectionViewFlowLayout. Создайте одну настраиваемую ячейку, которая представляет ваш единственный «экранный» макет, чем постройте простой источник данных как массив настраиваемых объектов. Источник данных должен содержать, например, содержимое всех ярлыков как переменные String.

Nice и элегантный код.

Вы можете бесплатно прокручивать анимацию и прокручивать жест. Если вам нравится, вы можете добавить свою необычную анимацию.

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

Другой вариант состоит в том, чтобы построить этот контроллер вида один раз и повторно использовать с различными наборами данных.

Так что это решение. Я бы пошел в 1, 3, 2 порядке :)

+0

Большое спасибо. Решение 'UICollectionView' выглядит многообещающим, но как я могу переключаться между пользовательскими ячейками? – Cesare

+0

Вы получите жестом салфетки бесплатно. Вы можете отключить его, если хотите. Для ручного запуска переключения вы можете использовать 'setContentOffset (_ contentOffset: CGPoint, анимированный анимированный: Bool)' и установить 'contentOffset.x = numberOfPage * CGRectGetWidth (self.bounds)' – psci

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