Xcode - 通过 segue returns null 传递给第二个 ViewController 的字符串
Xcode - String passed to second ViewController through segue returns null
我正在尝试将 NSString 从 ViewController 传递到第二个 ViewController,但值 returns null
。我正在使用 Storyboards 和一个在按下 selectDateButton
时触发的当前模态转场。
用户使用 UIDatePicker
选择日期,然后将值格式化为 MM/dd 并放入 NSString ivar。我正在使用那个 ivar 并在我的第二个 ViewController 中将其设置为 属性。我很确定我的错误可能在于我在 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;
}
}
秒ViewController.h
#import "ViewController.h"
@interface secondViewController : UIViewController {}
@property (nonatomic, strong)NSString *theDate;
- (IBAction)button:(id)sender;
@end
秒ViewController.m
- (IBAction)button:(id)sender {
NSLog(@"Selected Date: %@", _theDate);
}
问题是 Objective-C 中的实例变量默认有
@protected
存储限定符。这意味着 只有 class 本身及其子 classes 可以访问实例变量。
但是,您在 prepareforSegue 中实际做的是:
svc.theDate = selectedDateString;
即您正在通过 setter 方法向 BirthDayScreen 视图控制器实例传递对 selectedDateString 实例变量的引用,没有访问权限到 selectedDateString 实例变量。为什么?因为它与 ViewController class 没有任何关系并且变量本身 不是 public.
稍后当您尝试可能显示 UI 中的字符串时,您实际上在 ViewController 实例中有一个对 ivar 的引用,但它不可访问,因此您得到 null。
您可以在 ViewController
中明确地使其 public
@interface ViewController : UIViewController {
UIDatePicker *datePicker;
NSDateFormatter *dateFormatter;
NSDate *selectedDate;
@public NSString *selectedDateString;
}
但实际上这不是正确的做法。
相反,尝试将 theDate 属性 的存储限定符更改为
@property (nonatomic, copy)NSString *theDate;
这将创建一个新的 NSString 实例,它将是 selectedDateString 变量表示的 NSString 的一个副本,但是这个新复制的实例将属于 SecondViewController.
如果它还不够并且仍然不起作用(它应该),而不是在 ViewController header 中使用实例变量,创建一个适当的 public 属性称为 selectedDateString。
@interface ViewController : UIViewController {
UIDatePicker *datePicker;
NSDateFormatter *dateFormatter;
NSDate *selectedDate;
}
@property (nonatomic, strong) NSString *selectedDateString;
这样您就可以向外界公开支持 _selectedDateString 的值。
#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);
}
我正在尝试将 NSString 从 ViewController 传递到第二个 ViewController,但值 returns null
。我正在使用 Storyboards 和一个在按下 selectDateButton
时触发的当前模态转场。
用户使用 UIDatePicker
选择日期,然后将值格式化为 MM/dd 并放入 NSString ivar。我正在使用那个 ivar 并在我的第二个 ViewController 中将其设置为 属性。我很确定我的错误可能在于我在 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;
}
}
秒ViewController.h
#import "ViewController.h"
@interface secondViewController : UIViewController {}
@property (nonatomic, strong)NSString *theDate;
- (IBAction)button:(id)sender;
@end
秒ViewController.m
- (IBAction)button:(id)sender {
NSLog(@"Selected Date: %@", _theDate);
}
问题是 Objective-C 中的实例变量默认有
@protected
存储限定符。这意味着 只有 class 本身及其子 classes 可以访问实例变量。 但是,您在 prepareforSegue 中实际做的是:
svc.theDate = selectedDateString;
即您正在通过 setter 方法向 BirthDayScreen 视图控制器实例传递对 selectedDateString 实例变量的引用,没有访问权限到 selectedDateString 实例变量。为什么?因为它与 ViewController class 没有任何关系并且变量本身 不是 public.
稍后当您尝试可能显示 UI 中的字符串时,您实际上在 ViewController 实例中有一个对 ivar 的引用,但它不可访问,因此您得到 null。
您可以在 ViewController
中明确地使其 public@interface ViewController : UIViewController {
UIDatePicker *datePicker;
NSDateFormatter *dateFormatter;
NSDate *selectedDate;
@public NSString *selectedDateString;
}
但实际上这不是正确的做法。
相反,尝试将 theDate 属性 的存储限定符更改为
@property (nonatomic, copy)NSString *theDate;
这将创建一个新的 NSString 实例,它将是 selectedDateString 变量表示的 NSString 的一个副本,但是这个新复制的实例将属于 SecondViewController.
如果它还不够并且仍然不起作用(它应该),而不是在 ViewController header 中使用实例变量,创建一个适当的 public 属性称为 selectedDateString。
@interface ViewController : UIViewController {
UIDatePicker *datePicker;
NSDateFormatter *dateFormatter;
NSDate *selectedDate;
}
@property (nonatomic, strong) NSString *selectedDateString;
这样您就可以向外界公开支持 _selectedDateString 的值。
#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);
}