所以在我的应用程序中,我有一个嵌入在导航控制器中的向导类型流程,非常标准的应用程序设计,并且它工作正常。
所以此时我的设计问题是我需要在向导的每个点引入“日期”和日期选择,之前我只是在服务器端将所有内容加时间戳DateTime.Now()
,但这需要是现在可由用户编辑。
我似乎无法理解使用故事板执行此操作的正确方法,我想在故事板上放置一个“占位符”Datepicker视图并重新使用它。我不想为向导上的每个单页创建一个segue和日期选择器视图,这就是我现在所做的,这很糟糕。
所以我试着按照以下方式开始工作:
我有一个通用的日期选择器控件,并使用以下代码来提取它:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
UIViewController *vc = (UIViewController *)[storyboard instantiateViewControllerWithIdentifier:@"GenericDate"];
[self presentViewController:vc animated:YES completion:nil];
这会拉出视图,我可以选择一个日期,但是有一些问题:
如果有人能够正确地向我解释如何在故事板流程中重用“组件视图”,我将不胜感激。
此时segues和view控制器只有在它们是唯一的时才有意义,我不能完全遵循如何使它们成为可重用的组件。
答案 0 :(得分:2)
如果你想用故事板来做,那么一个答案就是:
在datepicker控制器中创建一个委托协议(在XYZDatePicker.h中的导入下面添加它):
#import<UIKit/UIKit.h>
@protocol DatePickerDelegate;
@interface XYZDatePicker : UIViewController
@property (nonatomic,weak)id<DatePickerDelegate> delegate;
@end
@protocol DatePickerDelegate<NSObject>
-(void)datePickerViewController:(XYZDatePicker*)datePicker didPickDate:(NSDate*)date;
@end
在日期选择器中创建一个属性以设置委托协议(参见上文)
在每个使用datepicker的vc中实现协议。这告诉您向协议确认的其他类。 (在你的调用vc .h文件中导入DatePicker并将委托添加到接口行):
#import XYZDatePicker.h
@interface XYZCallingViewController : UIViewController<XYZDatePickerDelegate>
在&#39; prepareForSegue&#39;每个调用vc的方法,将vc设置为日期选择器的委托
在日期选择器中选择了日期之后,您可以调用委托协议,它会将所选值返回到调用vc(在下面添加到您的XYZDatePicker.m,其中&#39; date&#39;是您想要返回调用VC的日期:
if([self.delegate respondsToSelector@selector(datePickerViewController:didPickDate:)] {
[self.delegate datePickerViewController:self didPickDate:date];
}
在调用VC .m文件中,您需要实现在符合的.h文件中声明的协议方法。这是将日期值返回给您的地方:
-(void)datePickerViewController:(XYZDatePicker*)datePicker didPickDate:(NSDate*)date {
//dismiss the date picker
[self dismissViewControllerAnimated:YES completion:^(void) {
//you may need to wait to call other UI transitions until this completes so you can put them in this block (or can set '...completion:nil];' if you don't need it
}];
if(date) {
//do something with the date
} else {
//if date=nil then the user cancelled (assuming you use this same delegate method if you allow the user to cancel picking the date)
}
}
另一种方法是在故事板中布置你的日期选择器,然后实例化它并从调用vc中显示它。您仍然需要委托协议来返回所选值。这消除了segues(步骤4和6)。
参考/教程的链接: