iOS问题在视图控制器之间共享数据

时间:2014-06-11 21:42:37

标签: ios uiviewcontroller share segue viewdidload

我在两个视图控制器之间传递数据时遇到问题。

我已经看到了两种方法。

一个涉及在segue的源视图控制器中实现prepareForSeque:,另一个涉及在segue的目标视图控制器的viewDidLoad:方法中设置属性。

e.g .-

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"toEmailReservationViewController"]) {
        FLSendEmailViewController *controller = (FLSendEmailViewController     *)segue.destinationViewController;
        if (!controller.startDateField.text) {

            controller.startDateField.text = @"today";
        }

    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.startDateField.text = ((FLViewController   *)self.presentingViewController).startDate;
}

我已经使用两个UIViewController来处理简单的应用。但是,我无法让他们使用UITabViewController连接到UINavigationViewController自定义子类UIViewController的应用。当我点击按钮执行推送序列时,我会看到我想要的视图,但startDateField.text没有来自segue的源视图控制器的文本。

为什么这些共享数据的方法无法与tab controllernavigation controller设置一起使用?

我注意到prepareForSegue:我无法设置controller.startDateField.text;如图所示,当我尝试设置它并使用NSLog显示它。这可能是问题吗?是否有可能属性controller.startDateField.text尚不存在?

我试图从FLViewController实例中的datePicker中获取日期,将此日期存储在属性NSString *startDate中,并将FLSendEmailViewController实例中的NSString *startDateField.text存储到`NSString *的startDate'

以下是我创建的UIViewController子类:

FLViewController.h

#import <UIKit/UIKit.h>

#import "FLSendEmailViewController.h"

// import frameworks to use ad
@import AddressBook;
@import AddressBookUI;

@interface FLViewController : UIViewController

    @property (weak, nonatomic) IBOutlet UIScrollView *theScroller;

    @property (weak, nonatomic) NSString *startDate;
    @property (weak, nonatomic) NSString *stopDate;

    - (IBAction)exitToReservations:(UIStoryboardSegue *)sender;

@end

FLViewController.m

#import "FLViewController.h"

@interface FLViewController ()

    @property (weak, nonatomic) IBOutlet UIDatePicker *startReservationDatePicker;
    @property (weak, nonatomic) IBOutlet UIDatePicker *stopReservationDatePicker;

@end

@implementation FLViewController

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        [self.theScroller setScrollEnabled:YES];
        [self.theScroller setContentSize:CGSizeMake(280, 1000)];

        //setup reservationDatePicker
        [self.startReservationDatePicker addTarget:self
                                            action:@selector(startDatePickerChanged:)
                                  forControlEvents:UIControlEventValueChanged];
        [self.stopReservationDatePicker addTarget:self
                                           action:@selector(stopDatePickerChanged:)
                                 forControlEvents:UIControlEventValueChanged];

    }

    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }

    // add method called when user changes start date
    - (void)startDatePickerChanged:(UIDatePicker *)datePicker
    {
        NSDateFormatter *dateFortmatter = [[NSDateFormatter alloc] init];
        [dateFortmatter setDateFormat:@"dd--MM-yyyy HH:mm"];
        // get date using stringFromData: method and getter datePicker.date
        self.startDate = [dateFortmatter stringFromDate:datePicker.date];
        NSLog(@"The start date is %@", self.startDate);
    }

    // add method called when user changes stop date
    - (void)stopDatePickerChanged:(UIDatePicker *)datePicker
    {
        NSDateFormatter *dateFortmatter = [[NSDateFormatter alloc] init];
        [dateFortmatter setDateFormat:@"dd--MM-yyyy HH:mm"];
        // get date using stringFromData: method and getter datePicker.date
        self.stopDate= [dateFortmatter stringFromDate:datePicker.date];
        NSLog(@"The stop date is %@", self.stopDate);

    }

    - (IBAction)exitToReservations:(UIStoryboardSegue *)sender {
        // execute this code upon unwinding
            [self dismissViewControllerAnimated:YES completion:nil];
    }

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue.identifier isEqualToString:@"toEmailReservationViewController"]) {
            FLSendEmailViewController *controller = (FLSendEmailViewController         *)segue.destinationViewController;
            if (!controller.startDateField.text) {

                controller.startDateField.text = @"today";
                NSLog(@"in vc startDate is null but set to %@",controller.startDateField.text );
            }
        }
    }
@end

FLSendEmailViewController.h

#import <UIKit/UIKit.h>

@class FLViewController;

    @interface FLSendEmailViewController : UIViewController

    @property (retain, nonatomic) IBOutlet UITextField *startDateField;
    @property (retain, nonatomic) IBOutlet UITextField *stopDateField;

@end

FLSendEmailViewController.m

#import "FLSendEmailViewController.h"
#import "FLViewController.h"

@interface FLSendEmailViewController ()

    - (IBAction)sendEmail:(id)sender;

    @property (weak, nonatomic) IBOutlet UITextField *numberOfDoggies;
    @property (weak, nonatomic) IBOutlet UITextField *emailAddressField;

    - (IBAction)hideKeyboard:(id)sender;

@end

@implementation FLSendEmailViewController

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
        // Custom initialization
        }
        return self;
    }

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.startDateField.text = ((FLViewController *)self.presentingViewController).startDate;

    }

    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }

    - (IBAction)sendEmail:(id)sender {
        NSString *emailString = [NSString stringWithFormat:@"I would like you to watch my %@ doggies from %@ to %@.  Thank you.", self.numberOfDoggies.text, self.startDateField.text, self.stopDateField.text];
        NSLog(@"%@",emailString);
    }
    - (IBAction)hideKeyboard:(id)sender {

        [self.startDateField resignFirstResponder];
    }
@end

2 个答案:

答案 0 :(得分:0)

  1. FLSendEmailViewController.h导入“InitialViewController.h”

  2. 将此属性添加到FLSendEmailViewController.h

    @property(非原子,强)NSString * exportedData;

  3. 将其添加到FLSendEmailViewController.m

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.startDateField.text = self.exportedData
    }
    
  4. 4

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
     {
    if ([segue.identifier isEqualToString:@"toEmailReservationViewController"]) {
        FLSendEmailViewController *controller = (FLSendEmailViewController     *)segue.destinationViewController;
        if (!controller.startDateField.text) {
    
            controller.exportedData = @"today";
        }
    
    }
    }
    

答案 1 :(得分:0)

此&#34; 分享方法&#34; 在从控制器转到另一个控制器的任何情况下都可以使用

因此,如果是navigation controller,如果您希望推送另一个viewController 传递数据,那么您只需要在故事板中设置触发器(如果您使用的是故事板)来自按钮,以及新的viewController

所以,你不会遇到麻烦。否则,您将提交其他类型的错误,在这种情况下,请更新您的问题。