一个ViewController与许多ViewControllers

时间:2012-03-13 16:18:22

标签: iphone objective-c cocoa-touch uiviewcontroller uiscrollview

我正在构建一个由不同视图组成的应用程序,这些视图彼此密切相关。到目前为止,我只有一个UIViewController来控制这些不同的视图。例如,视图1和2共享相同的背景,视图1和2之间的过渡是自定义动画。

我的问题是视图1和2都有一个UIScrollView。我的UIViewController是他们的委托,我可以使用以下scrollViewDidScroll来区分两个scrollviews:

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

滚动视图1会发生很多事情,而滚动视图2会发生不同的事情,代码将变得非常混乱。理想情况下,我想在单独的文件中定义滚动滚动等会发生什么。然而,我不想要另一个UIViewController,因为转换变得更加困难。我没有NavBar或ToolBar,所以UINavigationController和UITabBarController在我的情况下都不会很好用。

我该怎么办?

我发布了类似问题here

2 个答案:

答案 0 :(得分:3)

如果您不想要两个视图控制器,只需为每个滚动视图创建一个单独的委托。使其成为符合NSObject的{​​{1}},并在滚动视图的同时创建它。

似乎要组合您寻找的结果:一个视图控制器,但封装的滚动视图代码。

答案 1 :(得分:1)

您可以拥有一个处理常用功能的基本控制器类。每个不同的控制器都可以从此继承并根据需要覆盖其特定功能。

Aka the template pattern

修改

扩展。你说你只想要一个视图控制器。因此,您应该创建一个单独的类来处理各个功能。 View Controller有一个基类指针,它根据当前视图进行交换。

在伪代码中:

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