当控制器以模态方式呈现时,将数据传递给视图控制器不同?

时间:2014-01-17 04:31:58

标签: ios modalviewcontroller

我对iOS的东西很新,并且认为我理解将数据传递给视图控制器。显然不是。我试图将图像数据从父ViewController传递到以模态方式呈现的子ViewController。我认为问题与对象传递给模态呈现的视图控制器的方式有关,而不是将其推送到导航堆栈。贝娄是父母和孩子的代码,与我遇到的问题有关。

来自Parent.m:

- (IBAction)sort:(id)sender {
    SortSelectViewController *ssvc = [self.storyboard instantiateViewControllerWithIdentifier:@"sort"];
    ssvc.backgroundImage = [self screenshot];
    [self performSegueWithIdentifier:@"sort" sender:self];
    //The segue is linked from my parent view controller to my child with the identifier "sort"

}

- (UIImage *) screenshot {
    CGRect rect = CGRectMake(0, 20, 640, 1116);
    UIGraphicsBeginImageContextWithOptions(rect.size, NO, [UIScreen mainScreen].scale);

    [self.view drawViewHierarchyInRect:rect afterScreenUpdates:YES];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
    return image;
}

这是我的Child.h

@property (nonatomic, strong) UIImage *backgroundImage;

这是我的Child.m:

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    NSLog(@"%@", self.backgroundImage);
    //This log will return nil when the program is run - clear sign data is not being correctly passed
    self.backgroundImage = [self.backgroundImage applyDarkEffect];
    self.imageView.image = self.backgroundImage;
}

我已将子视图控制器导入到我的父类

2 个答案:

答案 0 :(得分:1)

您的代码(原始问题)正在混淆视图控制器和故事板segue的直接实例化。当您使用storyboard segue时,VC会自动实例化 您。您可以在“prepareForSegue:”方法中将其作为“目标视图控制器”在segue中访问。

发生的事情是你实例化一个视图控制器,设置图像,然后......它被抛弃并被忽略(整个vc)。

接下来,启动一个segue,iOS通过实例化另一个,不同的视图控制器来处理。这是iOS正在呈现的视图控制器。

所以:如果您打算使用Storyboard segue,iOS会为您实例化VC。不要自己实例化,因为没有办法将实例化的那个链接到iOS segue处理中。您实例化的那个是一个无关紧要的额外被忽略。

答案 1 :(得分:0)

尝试这样使用Story Bord必须使用两种方法的组合 performSegueWithIdentifier: * prepareForSegue: *

    - (IBAction)sort:(id)sender {

        [self performSegueWithIdentifier:@"sort" sender:self];
        //The segue is linked from my parent view controller to my child with the identifier "sort"

    }



    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {

        if ([[segue identifier] isEqualToString:@"sort"])
        {
           SortSelectViewController *ssvc = [segue destinationViewController];
        ssvc.backgroundImage = [self screenshot];
        }
     }

- (UIImage *) screenshot {
       //return normal image 
    return [UIImage imagenamed:"imagename.png"];
}