2012-02-22 115 views
1

我正在构建一个自定义控件,看起来像下图中的那个。iOS自定义控件

enter image description here

这将主要是采用了滑盖的菜单。箭头将允许我更改滑块轨道上显示的三天。根据我使用滑块选择的那一天,我想在主屏幕上更改一些视图(此菜单将位于我的页面底部)。所以基本上这是我唯一会在我的主控制器中“听”的东西:如果选择了某一天。

我已经想通了所有的代码,我将不得不写,但我不知道我应该继承UIControl或UIView。如果是这样,我应该在UIControl(UIView)中编写我的控制器的代码(改变日子,添加拖动效果等)?或者我应该继承UIViewController,并在那里写下所有的代码。 (但如果是这样,为什么我应该以第一种方式继承UIControl(UIView))。

所以基本上我想知道什么额外的文件,我需要创建,除了我的自定义控件的视图界面(我在IB做的),我应该在哪里放置代码(IBOutlets,IBAction方法)以及如何做我与主视图控制器进行通信(我将主控制器设置为我的自定义控件的代表?)。

对不起,很长的文章。

感谢

回答

4

我推荐子类UIControl。此控件的用户可以执行[yourControl addTarget:self action:@selector(someMethod:) forControlEvents:UIControlValueChanged];以对更改的值作出反应。在你的控制下,当你确定选择了新的一天时,你可以致电[self sendActionsForControlsEvents:UIControlValueChanged];,然后所有感兴趣的课程都会被告知。

保持该控件尽可能独立。这意味着,只需要给它尽可能多的逻辑就可以了,除此之外别无其他。想想你如何使用苹果提供的UI元素:尽量让你的通用(如果可行的话;在这里使用常识)。简而言之:您应该茁壮成长,使其足够通用,以便在您的应用的其他项目或其他地方对您有用。

+0

谢谢你的回答。我还有一个问题,我应该在哪个方法中添加我的初始化代码(例如,如果我想创建一个UIGestureRecognizer)。 – Cosmin 2012-02-22 14:50:42

+0

您将有更多的成功发布,作为一个单独的问题。干杯。 – picciano 2012-02-22 18:44:21

+0

@Cosmin:如果手势识别器对控件很重要(即控件需要它的功能),那么你可以在你的控件的'initWithFrame:'中初始化它。或者,如果你有不同的指定初始化你有初始化手势识别。 – DarkDust 2012-02-22 19:37:12

2

简短的回答是,你应该继承UIControl并把所有的逻辑来绘制组件,并与那里的组件进行交互。 UIControl继承自UIView并添加目标/动作行为。每当日期发生变化时,您都可以用sendAction:to:forEvents:UIControlEventValueChanged这样的方式。

您也可以为用户更改选定日期时实施委托协议。

例如:

@protocol DateSliderDelegate <NSObject> 
    - (void)dateSlider:(id)slider dateDidChange:(NSDate *)date fromDate:(NSDate *)oldDate; 
@end 

你不想使用UIViewController,因为它的工作是管理上级的意见,这样的小部件是在屏幕上。稍后当您使用组件时,您将使用视图控制器,并执行诸如设置日期以最初显示并监听更改事件等事情。

+0

我明白了,非常感谢。 – Cosmin 2012-02-22 14:51:29