【问题标题】:Xcode - String passed to second ViewController through segue returns nullXcode - 通过 segue 传递给第二个 ViewController 的字符串返回 null
【发布时间】:2015-02-20 20:59:57
【问题描述】:

我正在尝试将一个 NSString 从 ViewController 传递到 secondViewController,但该值返回 null。我正在使用 Storyboards 和一个在按下 selectDateButton 时触发的当前模态序列。

用户使用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);
}

【问题讨论】:

  • 你的目标视图控制器类是secondViewController还是Birthday Screen
  • 在更改我的帖子代码时忘记编辑它。无论如何,问题仍然存在。

标签: ios objective-c xcode nsstring segue


【解决方案1】:

问题是Objective-C中的实例变量默认有

@protected 

存储限定符。这意味着只有类本身及其子类可以访问实例变量。 但是,您在 prepareforSegue 中实际所做的是:

svc.theDate = selectedDateString;

即您正在通过 BirthDayScreen 视图控制器实例的 setter 方法传递对 selectedDateString 实例变量的引用,该实例无权访问 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 的适当公共属性,而不是在 ViewController 标头中包含实例变量。

@interface ViewController : UIViewController {
    UIDatePicker *datePicker;
    NSDateFormatter *dateFormatter;
    NSDate *selectedDate;
}

@property (nonatomic, strong) NSString *selectedDateString;

这样你将把支持的 _selectedDateString 的值暴露给外界。

【讨论】:

  • 就是这样,但由于某种原因它仍然无法正常工作。我最终重新创建了项目并正确地重写了每一点,它终于可以工作了!我认为破坏它的部分是使用相同的按钮设置selectedDateString 的值并以模态方式呈现新屏幕。我分配了一个按钮仅用于更改屏幕,另一个按钮用于设置值,它可以工作。
  • 更新:为了使用一个按钮来完成这两项工作,而不是通过右键单击 StoryBoards 将该按钮与 segue 链接到另一个视图控制器,我最终设置了一个手动视图控制器并调用它在按钮设置其方法中的值之后。
【解决方案2】:
#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);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多