我正在构建一个自定义控件,如下图所示。
它基本上是一个带滑块的菜单。箭头将允许我更改滑块轨道上的三天显示。根据我用滑块选择的那天,我想在主屏幕上更改一些视图(此菜单将在我的页面底部)。所以基本上这是我将在主控制器中“监听”的唯一内容:如果选择某一天。
我已经想出了我将要编写的所有代码,但我不确定我是否应该继承UIControl或UIView。如果是这样,我应该在哪里编写控制器的代码(更改日期,添加拖动效果等)在UIControl(UIView)中?或者我应该是UIViewController的子类,并在那里写下所有代码。 (但如果是这样,我为什么要以第一种方式继承UIControl(UIView))。
所以基本上我想知道我需要创建哪些额外的文件,除了我的自定义控件的视图界面(我在IB中做过),我应该把代码放在哪里(IBOutlets,IBAction方法)以及我该怎么做与主视图控制器通信(我将主控制器设置为我的自定义控件的委托?)。
很抱歉这篇长篇文章。
由于
答案 0 :(得分:4)
我建议继承UIControl
。此控件的用户可以[yourControl addTarget:self action:@selector(someMethod:) forControlEvents:UIControlValueChanged];
对更改的值做出反应。在你的控制中,当你确定选择了新的一天后,你打电话给[self sendActionsForControlsEvents:UIControlValueChanged];
,瞧,所有感兴趣的课程都会得到通知。
尽可能保持控制权。这意味着,只需要根据需要提供尽可能多的逻辑,仅此而已。想想你如何使用Apple提供的UI元素:尽量使你的通用(如果实际的话;在这里使用常识)。简而言之:你应该茁壮成长,使这个控件足够通用,以便它对你在其他项目或应用程序的其他地方有用。
答案 1 :(得分:2)
简短的回答是你应该继承UIControl
并将所有逻辑绘制成组件并与组件进行交互。 UIControl
继承自UIView
并添加了目标/操作行为。这样,只要日期发生变化,您就可以sendAction:to:forEvents:
UIControlEventValueChanged
。
您也可以在用户更改所选日期时实施委托协议。
例如:
@protocol DateSliderDelegate <NSObject>
- (void)dateSlider:(id)slider dateDidChange:(NSDate *)date fromDate:(NSDate *)oldDate;
@end
您不想使用UIViewController
,因为它的工作是管理更高级别的视图,例如您的窗口小部件所在的屏幕。稍后当您使用组件时,您将使用视图控制器,并执行诸如将日期设置为最初显示并监听更改事件等操作。