我将在我的应用中使用几个地方的datePicker。我不想用UIPickerViewDelegate和UIPickerDatasource的委托方法“混乱”每个viewController,而且我会一遍又一遍地执行相同的委托方法。
每次使用datePicker时,其唯一目的是在屏幕中间滑动,让用户选择日期然后再次消失。 我正在考虑实现datePicker委托方法的包装器viewController(DatePickerViewController),然后使用用户选择的值执行NSNotification,这再次被实例化DatePickerViewController的viewController捕获。 这将使我成为一个解耦的datePicker,并让viewController实例化datePicker一无所知DatePickerDelegate,但只知道可能会出现包含NSDate的通知。对我来说似乎是理性的,就像我会用其他语言做的那样。但如果我在这里挖洞,请纠正我:)
当我开始打破这个时,我遇到了一些困难,我对Objective C和Cocoa不是很有经验。 我可以构建一个viewController,在它的viewDidLoad中提供一个datePicker,运行这个将导致一个空白的白色屏幕,在屏幕的下半部分有一个datePicker。如果我使用viewController中的“presentModalViewController”实例化(自定义)DatePickerViewController,它当然会向上滑动并覆盖整个屏幕。我希望用户仍然可以看到一半的视图。就像在iCal应用程序中设置事件的时间一样。 (除了他们将新的viewController推送到堆栈上)。啊,我刚才意识到我的意思就像键盘滑入时一样,覆盖了屏幕的一半。
所以我猜我的主要问题是:你可以构建一个viewController,它在添加到视图时的行为就像键盘一样。但是在ViewController中添加所有这些,而不是在实例化视图的控制器中。
希望有道理:)
谢谢
答案 0 :(得分:1)
(1)将选择器放入模型(编辑:应该是模态)视图中。这就是键盘的实现方式。
(2)选择器控制器/委托应该只控制模型视图和选择器。
(3)在委托中创建两个属性,例如:
id * target; 选择器选择器;
和类似的方法:
- (void)sendPickerResultsTo:(id)theTarget forSelector:(SEl)theSelector;
(4)在显示选择器模型视图之前,将目标设置为调用控制器,将选择器设置为调用控制器中的方法。您可以配置选择器方法以传递任意数量的数据。它看起来像是:
- (void)pickerResults:(NSArray *)pickerResults; //可以传递任何值,只要它是一个对象
[注意:如果你经常使用它,你可以定义一个协议]
(5)当你有选择器值时,只需要选择器委托调用:
[self.target performSelector:theSelector withObject:anArrayOfPickerResults];
(5)在显示模型选择器视图之前,将适当的方法添加到需要唤起模型选择器视图并将控制器设置为目标的任何控制器。
这将为您提供一个独立的模型选择器视图,您可以将其附加到任何视图,并且可以将其结果发送到任何实现具有正确签名的方法的任意对象,即实现协议。
这基本上是一个自己动手的UIControls版本addTarget:action:forControlEvents: