我对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;
}
我已将子视图控制器导入到我的父类
中答案 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"];
}