2014-01-25 4 views
0

Я пытался интерпретировать уроки из CS193P и задал несколько вопросов.MVC с видом встроенный код

Я строю представления в коде, так как я это делаю. У меня есть подкласс UIView, где я помещаю все представления в место в методе init. Этот класс инициализируется ViewController.

Вопрос в том, какой правильный подход отсюда - скажем, я хочу анимировать кнопку, которую я разместил на 0,0 - 100,100. Я хотел бы оживить его из ViewController, но мне не нравится тот факт, что я установил позицию 0,0 в классе UIView (в инициализаторе), и теперь я устанавливаю новую позицию в ViewController. Я бы предпочел, чтобы было только одно место, знающее о фактических (х, у) позициях моих взглядов.

Как я должен это делать?

  1. Перемещение позиции в инициализаторе к ViewController
  2. Поместите метод в моем UIView «- (Недействительными) AnimateToSecondPosition», где фактический «вторая позиция», затем до точки зрения?
  3. Просто отпустите. Кажется, что это был бы правильный подход, если бы я разместил кнопку в построителе интерфейса - я считаю, что построитель интерфейса будет представлением ...

Возможно, даже четвертый вариант?

Пожалуйста, помогите мне понять это лучше, а не просто дать мне правильный ответ;)

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

Я предполагаю, что случай будет таким же для отключения, скрытия и выполнения других вещей с представлениями.

Заранее спасибо.

ответ

0

Если вы хотите создать новый вид программно вы обычно должны создать его экземпляр в вашем View Controller, используя отведенный Инициализатор:

UIView *testView = [[UIView alloc]initWithFrame:myFrame]; 

Если создать пользовательский вид это совершенно нормально и правильно поставить некоторые конфигурации кода в методе init, но это ваш ViewController, который должен отвечать за решение, что делать с этим представлением - это его работа! Использование MVC View и Model никогда не должны связываться напрямую (как вы определенно узнали на первом уроке CS193P).

Поэтому то же самое относится к анимации. Вы должны анимировать представления в вашем ViewController и не реализовывать анимацию в самом представлении.

Поэтому, по-моему, вы должны установить «вторую позицию» VC - если это необходимо сделать, когда что-то происходит с видом (например, кто-то нажал на UIButton), вы должны установить цель/действие на ваш VC и обрабатывайте это в своем VC.

ДОБАВЛЕНО: Что касается строительных UIViews в Interface Builder, я не знаю, что вы имеете в виду «и пусть они идут». Конструктор интерфейсов создаст представления и добавит их в определенные супервизоры во время выполнения - как вы можете видеть в приведенном ниже примере, вы управляете иерархией представлений графически слева. Например, в этом случае есть UIView (который я нарисовал зеленым для ясности) и двумя кнопками. Один из них является подпунктом основного вида, а другой - подвид зеленого UIView. Storyboard Example

После того, как ваш ViewController загружается иерархия вид автоматически загружается в self.view - на самом деле, если вы запустите следующий код в ваш ВК, когда он будет загружен, вы увидите список self.views подвидов в консоли ,

for (UIView *view in self.view.subviews){ 
    NSLog("%@", [view description]); 
} 

Если вы уже знаете, что вам нужно изменить некоторые атрибуты конкретного UIView вы настройки с помощью Interface Builder (например, мы знаем, что мы хотим, чтобы программно изменить цвет зеленого UIView в примере выше), вы должны создать выход, который позволяет вам ссылаться на это представление в вашем коде. Вы делаете это с помощью crtl-drag от раскадровки до вашего кода ViewController - см. Пример ниже.

Create Outlet 1 Create Outlet 2 Create Outlet 3

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

Надеюсь, это поможет.

+0

Итак, что вы считаете «кодом конфигурации»? Это позиции, состояния, цели и другие свойства подзаголовков? Но скажите, что у меня была кнопка, которая должна быть скрыта, если свойство в моей модели является ложным и отображается, если свойство истинно. Это означало бы, что я скрою кнопку в моем диспетчере представлений после вызова метода init, если он должен быть скрыт, правильно? – Lyck

+0

И как это сопоставимо с тем, как он будет работать с помощью конструктора интерфейса? – Lyck

+0

Я имел в виду пользовательский UIView - в качестве примера предположим, что вы хотите создать специальный вид, который показывает оттенок серебристого градиента. UIButton этого не делает, поэтому вам нужно написать собственный UIView (возможно, подклассифицировать UIButtton), и вы можете ввести UIView init необходимый код конфигурации. – tanzolone

0

Вы можете добавить -setButtonFrameToSecondPosition к подклассу вида, который просто обновляет рамку кнопки, а затем вызывает это из контроллера вида через один из методов +[UIView animate:...].

+0

не было бы это неправильно? Я знаю, что это возможно, но таким образом позиция - это ответственность за взгляды? – Lyck

+0

Все зависит от того, как вы хотите структурировать свой код, и есть много факторов, которые следует учитывать, если у вас еще нет стиля, который вы предпочитаете. Например, что представляет собой сама анимация? Если в ответ на изменение состояния в представлении, возможно, все, что вам нужно, это свойство состояния, которое при наборе выполняет анимацию. –

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