在init方法上通过segue nil传递嵌套但在viewdidload上有效

时间:2016-07-09 03:10:38

标签: ios objective-c segue init

我做了一个segue传递一个字符串,告诉下一个视图控制器解析CoreData的实例。问题是,我正在使用一些调用init方法的代码,并且在调用时不会初始化发送的字符串。但是,当我在目标视图控制器的viewDidLoad

中显示字符串时,segue正在工作
- (id)init
{
    self = [super init];
    if (self)
    {

        [self initFakeData];
    }
    return self;
}

当调用initFakeData方法时,它会设置一个图表并需要练习来保存有效值

- (void)initFakeData
{
    NSString *myExercise=exercise; //returns nil
    if (myExercise==nil) 
    {
        myExercise=@"Default";
    }
}

...同时

-(void)viewDidLoad{
    NSString *myExercise=exercise; //returns value
}

exercise是一个属性,由tableview中的前一个视图控制器初始化

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

    if ([segue.identifier isEqualToString:@"showGraph"]) {
        JBLineChartViewController *destViewController =    segue.destinationViewController;
        NSString *myExericse=[NSString stringWithFormat:@"%@", [[_exercises valueForKey:@"exercise"]objectAtIndex:indexPath.row]];
        NSLog(@"%@",myExericse);
        destViewController.exercise = myExericse;
    }
}

2 个答案:

答案 0 :(得分:1)

行为是正确的,因为在init期间exercise中的JBLineChartViewController未设置。如果您需要exercise方法中的init属性来设置必须在viewDidLoad之前的某些行为,我的建议是不使用segue,而是指定initWithExercise 1}}并在代码中推送控制器。也许是这样的:

- (IBAction)chartButtonPressed:(id)sender {

    JBLineChartViewController *vc = [[ShopViewController alloc]initWithExercise:@"EXERCISE_STRING_HERE"];
    [self showViewController:vc sender:self];

}

答案 1 :(得分:0)

在调用 prepareForSegue之前,新的视图控制器已分配并初始化。您需要对CoreData执行的任何操作都应在viewDidLoad中完成。或者你可以稍后再做,例如在viewWillAppearviewDidAppear