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);

}