На UIScrollView ссылаются как на свойство UIViewController 'view', так и на выход - PullRequest
1 голос
/ 05 ноября 2011

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

Уроки, которые я видел, обычно включают добавление UIScrollView к существующему UIView, и они работают оттуда. Однако мне было интересно, могу ли я вообще сэкономить UIView и просто добавить UIScrollView в качестве единственного объекта верхнего уровня в моем nib-файле.

В моем примере проекта используется приложение Xcode * View-based template:
Навигатор проекта http://img542.imageshack.us/img542/5364/projectnavigator.png

Я удалил объект верхнего уровня UIView из исходного файла MySampleViewController.xib и заменил его, добавив объект UIScrollView:
Перья заполнителей http://img526.imageshack.us/img526/7709/placeholderobjects.png

Теперь мой nib-файл показывает только этот объект на холсте:
Холст http://img233.imageshack.us/img233/4063/scrollview.png

Затем я создал ссылку из UIViewController s view розетки на UIScrollView.

Теперь, если я хочу программно манипулировать содержимым UIScrollView, я могу использовать этот код:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], nil];
    // Solution B: With the following line we avoid creating an extra outlet linking to the UIScrollView top-level object in the nib file
    UIScrollView *scrollView = (UIScrollView *)self.view;
    for (int i = 0; i < colors.count; i++) {
        CGRect frame;
        //frame.origin.x = self.scroller.frame.size.width * i;  // Solution A: scroller is an IBOutlet UIScrollView *scroller;
        frame.origin.x = scrollView.frame.size.width * i;       // Solution B
        frame.origin.y = 0;
        //frame.size = self.scroller.frame.size;                // Solution A
        frame.size = scrollView.frame.size;                     // Solution B

        UIView *subView = [[UIView alloc] initWithFrame:frame];
        subView.backgroundColor = [colors objectAtIndex:i];
        //[self.scroller addSubview:subView];                   // Solution A
        [self.view addSubview:subView];                         // Solution B

        [subView release];
    }
    //self.scroller.contentSize = CGSizeMake(self.scroller.frame.size.width * colors.count, self.scroller.frame.size.height); // Solution A
    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * colors.count, scrollView.frame.size.height);  // Solution B
}

Для реализации решения A выход скроллера должен быть также связан с UIScrollView пера, а инспектор подключений выглядит следующим образом:
Инспектор соединений http://img228.imageshack.us/img228/8397/connectionsj.png


Решение A требует розетки, и это означает, что имеется два подключения к UIScrollView: собственная UIViewController view и MySampleViewController scroller. Законно и / или рекомендовано ли иметь два выхода, указывающих на один и тот же вид?

Решение B включает только выход UIViewController view, связанный с видом и использующий эту строку:

UIScrollView *scrollView = (UIScrollView *)self.view;

Мои вопросы:

  1. Влечет ли я какое-то нарушение правил разработки Apple при использовании одного из этих двух решений?
  2. Должен ли я придерживаться UIScrollView в решении UIView?
  3. Есть ли другой способ реализовать это?

Спасибо!

P.S. Извините за подсветку синтаксиса, SO не распознал использование тега 'target-c'

1 Ответ

4 голосов
/ 05 ноября 2011
  1. Нет, я думаю, вы в порядке в любом случае.

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

  3. Похоже, вы управляете им.

Для решения A требуется розетка, а это означает наличие двух подключений к UIScrollView: собственная розетка представления UIViewController и розетка прокрутки MySampleViewController.Является ли законным и / или рекомендовано иметь два выхода, указывающие на один и тот же вид?

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

Если вам не нужны два выхода, вы можете дать представлению прокрутки тег, а затем найти его так:

UIScrollView *myScrollView = (UIScrollView *)[self.view viewWithTag:1]

Тогда у вас будет только представление в качестве розетки, но я быпросто добавьте дополнительный выход.Просто убедитесь, что вы установили их в nil в вашем viewDidUnload.

Также вам не нужно сохранять представление прокрутки (если вы все еще используете сохранение / отпускание).Поскольку представление прокрутки находится внутри представления вашего контроллера представления, оно сохраняет ссылку, поэтому вы можете иметь свойство вашего прокрутки по назначению или по неделям, если вы используете ARC.

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

...