Xcode - 通过segue传递给第二个ViewController的String返回null

时间:2015-02-20 20:59:57

标签: ios objective-c xcode nsstring segue

我正在尝试将一个NSString从ViewController传递给secondViewController,但该值返回null。我正在使用Storyboards和当按下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);
}

2 个答案:

答案 0 :(得分:4)

问题是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的值暴露给外界。

答案 1 :(得分:-1)

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

}