【问题标题】:One ViewController vs. many ViewControllers一个 ViewController 与多个 ViewController
【发布时间】:2012-03-13 16:18:22
【问题描述】:

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

我的问题是视图 1 和 2 都有 UIScrollView。我的 UIViewController 是他们的代表,我可以使用以下 scrollViewDidScroll 来区分两个滚动视图:

 - (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 在我的情况下都不能很好地工作。

我该怎么办?

我发布了一个类似的问题here

【问题讨论】:

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


    【解决方案1】:

    如果您不想要两个视图控制器,只需为每个滚动视图创建一个单独的委托。将其设为符合UIScrollViewDelegateNSObject,并与滚动视图同时创建。

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

    【讨论】:

    • 所以我会在一个文件中包含 scrollViewDidScroll 方法,我可以调用 svController.m 将它设置为我的 UIScrollView 的委托,对吗?像 scrollView.delegate = svController;听起来像一个非常干净的解决方案。非常感谢这个,会试一试的。不过,你会使用两个 ViewController 吗?我想 UINavigationController 在我的情况下会非常好,如果我只能自定义转换......
    • 赞同这个答案并强调这一点:您的应用程序的控制器部分不必仅由视图控制器组成。
    • @Tommy 谢谢。所以只有一个 ViewController 没有什么问题。我不知何故觉得我需要做一些复杂而困难的代码魔术,从我的主 ViewController 中交换其他 UIViewController。
    • 考虑在分解滚动视图委托后,您的视图控制器中还有多少 if .. else if .. else if 代码。如果超过 2-3 种方法,则可能值得尝试找到更清洁的解决方案。我建议使用UINavigationController 发布一个关于自定义转换的单独问题。
    • 但是,汤米说的。您可以使用多个类来设计控制器层,这通常会导致代码更清晰、更易于维护。
    【解决方案2】:

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

    又名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
    

    【讨论】:

    • 嗯,我不确定我是否理解。所以我有一个基本的 UIViewController?然后从这个基本 UIViewController 继承的不同控制器?这在代码中会是什么样子?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多