如何在故事板iOS7中正确重用模态视图/控制器

时间:2014-07-29 00:21:50

标签: ios objective-c

所以在我的应用程序中,我有一个嵌入在导航控制器中的向导类型流程,非常标准的应用程序设计,并且它工作正常。

所以此时我的设计问题是我需要在向导的每个点引入“日期”和日期选择,之前我只是在服务器端将所有内容加时间戳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];

这会拉出视图,我可以选择一个日期,但是有一些问题:

  1. 它不是“导航控制器”的一部分,也不是向导的流程
  2. 我真的不知道如何“回应”日期选择器的结果,即使它已正确嵌入到nag控制器中
  3. 如果有人能够正确地向我解释如何在故事板流程中重用“组件视图”,我将不胜感激。

    此时segues和view控制器只有在它们是唯一的时才有意义,我不能完全遵循如何使它们成为可重用的组件。

1 个答案:

答案 0 :(得分:2)

如果你想用故事板来做,那么一个答案就是:

  1. 创建一个带有日期选择器的控制器
  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
    
  3. 在日期选择器中创建一个属性以设置委托协议(参见上文)

  4. 将需要选择器的每个viewcontroller中的模态segue连接到 datepicker控制器
  5. 在每个使用datepicker的vc中实现协议。这告诉您向协议确认的其他类。 (在你的调用vc .h文件中导入DatePicker并将委托添加到接口行):

    #import XYZDatePicker.h
    
    @interface XYZCallingViewController : UIViewController<XYZDatePickerDelegate> 
    
  6. 在&#39; prepareForSegue&#39;每个调用vc的方法,将vc设置为日期选择器的委托

  7. 在日期选择器中选择了日期之后,您可以调用委托协议,它会将所选值返回到调用vc(在下面添加到您的XYZDatePicker.m,其中&#39; date&#39;是您想要返回调用VC的日期:

    if([self.delegate respondsToSelector@selector(datePickerViewController:didPickDate:)] {
        [self.delegate datePickerViewController:self didPickDate:date];
    } 
    
  8. 在调用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)
        }
    }
    
  9. 另一种方法是在故事板中布置你的日期选择器,然后实例化它并从调用vc中显示它。您仍然需要委托协议来返回所选值。这消除了segues(步骤4和6)。

    参考/教程的链接: