我正在尝试将一个NSString从ViewController传递给secondViewController,但该值返回null
。我正在使用Storyboards和当按下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);
}
答案 0 :(得分:4)
问题是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的值暴露给外界。
答案 1 :(得分:-1)
#import "AppDelegate.h"
@property (nonatomic,strong) NSString *theDate;
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSString *str = [NSString StringWithFormate:@"%@",appDelegate.imageStringName];
NSLog(@"str : %@",str);
}