Один ViewController против многих ViewController - PullRequest
1 голос
/ 13 марта 2012

Я создаю приложение, которое состоит из разных представлений, тесно связанных друг с другом. Пока у меня есть только один UIViewController, который управляет этими различными представлениями. Например, представления 1 и 2 используют один и тот же фон, а переход между представлениями 1 и 2 является пользовательской анимацией.

Моя проблема в том, что оба вида 1 и 2 имеют UIScrollView. Мой UIViewController является их делегатом, и у меня может быть следующий scrollViewDidScroll, чтобы различать два вида scrollview:

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
   if (scrollView.tag == 1) 
     //handle a
   else if (scrollView.tag == 2)
     //handle b
   else if (scrollView.tag == 3)
     //handle c
}

Поскольку со scrollView 1 многое происходит, а со scrollView2 происходят разные вещи, код будет очень запутанным. В идеале я хотел бы определить в отдельном файле, что происходит, если scrollView1 прокручивается и т. Д. Но я не хочу иметь еще один UIViewController, так как тогда переходы становятся более сложными. У меня нет NavBar или ToolBar, поэтому ни UINavigationController, ни UITabBarController не будут работать очень хорошо в моем случае.

Что мне делать?

Я отправил похожий вопрос здесь .

Ответы [ 2 ]

3 голосов
/ 13 марта 2012

Если вам не нужны два контроллера представления, просто создайте отдельный делегат для каждого представления прокрутки.Сделайте его NSObject, который соответствует UIScrollViewDelegate, и создайте его одновременно с представлением прокрутки.

Похоже, что объединены результаты, которые вы ищете: один контроллер представления, но инкапсулированный код представления прокрутки.

1 голос
/ 13 марта 2012

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

Ака шаблон шаблона

Редактировать

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

В псевдокоде:

class BaseFunctionality
  -(void) handleDidScroll {}
end

class ScrollViewAFunctionality : BaseFunctionality
  -(void) handleDidScroll {
     // Lots of interesting technical stuff...
  }
end

class ScrollViewBFunctionality : BaseFunctionality
  -(void) handleDidScroll {
     // Lots of interesting technical stuff...
  }
end


class TheViewController : UIViewController
   BaseFunctionality *functionality;

   -(void) swapViews {

     // Code to swap views
     [this.functionality release];

     if (view == A)
        this.functionality = [[ScrollViewAFunctionality alloc] init]
     else if ( view == B)
        this.functionality = [[ScrollViewBFunctionality alloc] init]
   }

   - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
        [this.functionality handleDidScroll];
   }

end
...