我正在尝试将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的值向外界公开。

07-27 13:40