Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 一个ViewController与多个ViewController_Iphone_Objective C_Cocoa Touch_Uiviewcontroller_Uiscrollview - Fatal编程技术网

Iphone 一个ViewController与多个ViewController

Iphone 一个ViewController与多个ViewController,iphone,objective-c,cocoa-touch,uiviewcontroller,uiscrollview,Iphone,Objective C,Cocoa Touch,Uiviewcontroller,Uiscrollview,我正在构建一个应用程序,它包含了彼此密切相关的不同视图。到目前为止,我只有一个UIViewController来控制这些不同的视图。例如,视图1和视图2共享相同的背景,并且视图1和视图2之间的过渡是自定义动画 我的问题是视图1和视图2都有一个UIScrollView。我的UIViewController是他们的代表,我可以使用以下scrollViewDidScroll来区分这两个ScrollView: - (void)scrollViewDidScroll:(UIScrollView *)sc

我正在构建一个应用程序,它包含了彼此密切相关的不同视图。到目前为止,我只有一个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发生了很多事情,scrollView 2也发生了很多事情,所以代码会变得非常混乱。理想情况下,我想在一个单独的文件中定义如果滚动了scrollView1会发生什么。。然而,我不想有另一个UIViewController,因为这样转换变得更加困难。我没有导航栏或工具栏,因此UINavigationController和uitabarcontroller在我的情况下都不能很好地工作

我该怎么办


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

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

阿卡

编辑

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

在伪代码中:

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

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

阿卡

编辑

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

在伪代码中:

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

如果不需要两个视图控制器,只需为每个滚动视图创建一个单独的代理即可。将其设置为符合
UIScrollViewDelegate
NSObject
,并与滚动视图同时创建


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

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


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

Hmm,我不确定我是否理解。所以我要一个基本的UIViewController?然后是从这个基础UIViewController继承的不同控制器?这在代码中会是什么样子?嗯,我不确定我是否理解。所以我要一个基本的UIViewController?然后是从这个基础UIViewController继承的不同控制器?这在代码中是什么样子的?所以我会在一个文件中使用scrollViewDidScroll方法,我可以调用svController.m,我将它设置为UIScrollView的委托,对吗?比如scrollView.delegate=svController;听起来是一个非常干净的解决方案。非常感谢,我会试一试的。不过,您会选择两个视图控制器吗?我想,在我的情况下,如果我能自定义转换,UINavigationController会非常好……认可这个答案并强调这一点:应用程序的控制器部分不必只包含视图控制器。@Tommy谢谢。因此,只有一个ViewController没有什么问题。我不知何故觉得我需要做复杂和困难的代码魔术交换其他UIVIEW控制器从我的主VIEW控制器。考虑多少代码< >如果…否则。。否则,如果将滚动视图委托分解后代码仍保留在视图控制器中。如果超过2-3种方法,那么可能值得尝试寻找更清洁的解决方案。我建议发布一个关于使用
UINavigationController
的自定义转换的单独问题。但是,Tommy说了什么。你可以用多个类来设计你的控制器层,这通常会产生更干净、更易维护的代码。所以我会在一个文件中使用scrollViewDidScroll方法,我可以调用svController.m,我将它设置为UIScrollView的委托,对吗?比如scrollView.delegate=svController;听起来是一个非常干净的解决方案。非常感谢,我会试一试的。不过,您会选择两个视图控制器吗?我想,在我的情况下,如果我能自定义转换,UINavigationController会非常好……认可这个答案并强调这一点:应用程序的控制器部分不必只包含视图控制器。@Tommy谢谢。因此,只有一个ViewController没有什么问题。我不知何故觉得我需要做复杂和困难的代码魔术交换其他UIVIEW控制器从我的主VIEW控制器。考虑多少代码< >如果…否则。。否则,如果将滚动视图委托分解后代码仍保留在视图控制器中。如果超过2-3种方法,那么可能值得尝试寻找更清洁的解决方案。我建议发布一个关于使用
UINavigationController
的自定义转换的单独问题。但是,Tommy说了什么。您可以使用多个类设计控制器层,这通常会导致代码更干净、更易于维护。