ios - Xcode - 通过 segue 传递给第二个 ViewController 的字符串返回 null

标签 ios objective-c xcode nsstring segue

我正在尝试将 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/

相关文章:

ios - 何时在 Swift 中使用可选值 (?) 以及何时使用关联值 (!)?

ios - Swift Cocoa 按钮未到位

iphone - 如何为另一个设备复制整个XCode项目?

ios - 双核 ARM7 是否提供内核之间的缓存一致性?

ios - 我如何知道 iOS 上的默认度量系统(英制或公制)?

ios - 从 UIWebView 打印 PDF 会产生未缩放的页面

javascript - 在 Objective C 中执行 js

iphone - Core Data 从不释放从外部存储加载的 NSData

ios - 飞行模式下的NSURLConnection

xcode - 如何使用 CGImageRef 图像在 NSView 中显示图像