我正在尝试将NSString从ViewController传递给secondViewController,但该值返回null
。我正在使用情节提要和当按selectDateButton
时将触发的当前模式segue。
用户使用UIDatePicker
选择日期,然后将该值格式化为MM / dd并放入NSString ivar。我正在使用该ivar,并将其设置为我的secondViewController中的属性。我很确定我的错误可能是在prepareForSegue
部分中写的方式。
我也尝试将其写为svc.theDate = [NSString stringWithFormat:@"%@", selectedDateString];
无济于事。
我不知道为什么会这样,不胜感激。
ViewController.h
#import "secondViewController.h"
@interface ViewController : UIViewController {
UIDatePicker *datePicker;
NSDateFormatter *dateFormatter;
NSDate *selectedDate;
NSString *selectedDateString;
}
ViewController.m
- (IBAction)selectDateButton:(id)sender {
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM/dd"];
selectedDate = [datePicker date];
selectedDateString = [dateFormatter stringFromDate:selectedDate];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"toSecondViewController"]) {
secondViewController *svc = [segue destinationViewController];
svc.theDate = selectedDateString;
}
}
secondViewController.h
#import "ViewController.h"
@interface secondViewController : UIViewController {}
@property (nonatomic, strong)NSString *theDate;
- (IBAction)button:(id)sender;
@end
secondViewController.m
- (IBAction)button:(id)sender {
NSLog(@"Selected Date: %@", _theDate);
}
最佳答案
问题在于,默认情况下,Objective-C中的实例变量具有
@protected
存储预选赛。这意味着只有类本身及其子类可以访问实例变量。
但是,您在prepareforSegue中实际执行的操作是:
svc.theDate = selectedDateString;
也就是说,您正在通过setter方法将对selectedDateString实例变量的引用传递给BirthDayScreen视图控制器实例,该实例无法访问selectedDateString实例变量。为什么?因为它与ViewController类没有任何关系,并且变量本身不是公共的。
稍后,当您尝试在UI中显示字符串时,实际上在ViewController实例中有一个对ivar的引用,但是它不可访问,因此您将获得null。
您可以在ViewController中显式将其公开
@interface ViewController : UIViewController {
UIDatePicker *datePicker;
NSDateFormatter *dateFormatter;
NSDate *selectedDate;
@public NSString *selectedDateString;
}
但这实际上不是正确的方法。
而是尝试将theDate属性的存储限定符更改为
@property (nonatomic, copy)NSString *theDate;
这将创建一个新的NSString实例,该实例将是selectedDateString变量表示的NSString的副本,但是此新复制的实例将属于SecondViewController。
如果还不够,但仍然无法正常工作(应该),则不要在ViewController头中包含实例变量,而要创建一个称为selectedDateString的适当公共属性。
@interface ViewController : UIViewController {
UIDatePicker *datePicker;
NSDateFormatter *dateFormatter;
NSDate *selectedDate;
}
@property (nonatomic, strong) NSString *selectedDateString;
这样,您就可以将_selectedDateString的值向外界公开。