1

我将在我的应用程序的几个地方使用 datePicker。我不想用 UIPickerViewDelegate 和 UIPickerDatasource 的委托方法“弄乱”每一个 viewController,而且我会一遍又一遍地做同样的委托方法。

每次使用 datePicker 时,它的唯一目的是在屏幕上滑动一半,让用户选择一个日期,然后再次消失。我正在考虑实现 datePicker 委托方法的包装器 viewController (DatePickerViewController),然后使用用户选择的值执行 NSNotification,这再次被实例化 DatePickerViewController 的 viewController 捕获。这将使我成为一个解耦的 datePicker,并让实例化 datePicker 的 viewController 对 DatePickerDelegate 一无所知,但只知道可能会出现一个包含 NSDate 的通知。对我来说似乎很理性,就像我会用其他语言做的事情一样。但是,如果我在这里给自己挖一个洞,请纠正我:)

当我开始分解它时,我遇到了一些困难,我在 Objective C 和 Cocoa 方面不是很有经验。我可以构建一个 viewController,在它的 viewDidLoad 中显示一个 datePicker,运行这将导致一个空白的白色屏幕,并在屏幕的下半部分显示一个 datePicker。如果我从实例化(自定义)DatePickerViewController 的 viewController 中使用“presentModalViewController”,它当然会向上滑动并覆盖整个屏幕。我希望用户仍然有一半的视图可见。就像在 iCal 应用程序中设置事件的时间一样。(除了他们将一个新的 viewController 推到堆栈上)。啊,刚刚意识到我的意思与滑入并覆盖一半屏幕时的键盘完全一样。

所以我想我的主要问题是:你能否构建一个在添加到视图时表现得像键盘的视图控制器。但是在添加的 ViewController 中而不是在实例化视图的控制器中执行所有这些操作。

希望这是有道理的:)

谢谢

4

1 回答 1

1

(1)将选择器放在模型(编辑:应该是模态的)视图中。这就是键盘的实现方式。

(2) 选择器控制器/委托应该只控制模型视图和选择器。

(3) 在委托中创建两个属性,例如:

id *目标;选择器 theSelector;

和类似的方法:

-(void) sendPickerResultsTo:(id) theTarget for Selector:(SEl) theSelector;

(4) 在显示选择器模型视图之前,将目标设置为调用控制器,将选择器设置为调用控制器中的方法。您可以配置选择器方法以传递任意数量的数据。它看起来像:

-(无效)pickerResults:(NSArray *)pickerResults;//可以传递任何值,只要它是一个对象

[注意:如果你经常使用它,这是你定义协议的一种东西]

(5) 当你有选择器值时,只需调用选择器委托:

[self.target performSelector:theSelector withObject:anArrayOfPickerResults];

(5) 将适当的方法添加到需要调用模型选择器视图的任何控制器,并在显示模型选择器视图之前将控制器设置为目标。

这将为您提供一个独立的模型选择器视图,您可以将其附加到任何视图,并且可以将其结果发送到任何实现具有正确签名的方法的任意对象,即实现协议。

这基本上是 UIControls addTarget:action:forControlEvents 的自己动手版本:

于 2009-11-10T18:05:12.793 回答