我正在尝试将 NSString 从 ViewController 传递到 secondViewController,但该值返回 null
。我正在使用 Storyboards 和一个在 selectDateButton
被按下时触发的 present modally 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 View Controller 实例,该实例无权访问 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。
如果这还不够并且仍然不起作用(它应该),请创建一个名为 selectedDateString 的适当公共(public)属性,而不是在 ViewController header 中使用实例变量。
@interface ViewController : UIViewController {
UIDatePicker *datePicker;
NSDateFormatter *dateFormatter;
NSDate *selectedDate;
}
@property (nonatomic, strong) NSString *selectedDateString;
这样您就可以向外界公开支持 _selectedDateString 的值。
关于ios - Xcode - 通过 segue 传递给第二个 ViewController 的字符串返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28638099/