我在两个视图控制器之间传递数据时遇到问题。
我已经看到了两种方法。
一个涉及在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 controller
和navigation 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
答案 0 :(得分:0)
将FLSendEmailViewController.h
导入“InitialViewController.h”
将此属性添加到FLSendEmailViewController.h
@property(非原子,强)NSString * exportedData;
将其添加到FLSendEmailViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
self.startDateField.text = self.exportedData
}
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
。
所以,你不会遇到麻烦。否则,您将提交其他类型的错误,在这种情况下,请更新您的问题。