Передача данных в контроллер представления отличается, когда контроллер представлен модально?

Я новичок в 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;

Это мой ребенок.м:

-(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;
}

Я импортировал свой дочерний контроллер представления в родительский класс.


person smallTeamCraft Development    schedule 17.01.2014    source источник
comment
возможный дубликат Как передать информацию между сегментами раскадровки?   -  person Midhun MP    schedule 17.01.2014
comment
Попробуйте перенести изображение в делегат приложения и назначить изображение в контроллере дочернего представления в методе viewwillapper.   -  person Charan Giri    schedule 17.01.2014


Ответы (2)


попробуйте так. Используя 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"];
}
person Muralikrishna    schedule 17.01.2014
comment
РЕДАКТИРОВАТЬ: извините, я не изменил метод инициализации контроллера представления на этот. Это работает, но почему я не могу сделать все это нажатием кнопки? - person smallTeamCraft Development; 17.01.2014

Ваш код (исходный вопрос) объединяет прямое создание экземпляров контроллера представления и раскадровки. Когда вы используете переход к раскадровке, экземпляр VC создается автоматически для вас. Вы обращаетесь к нему как к «контроллеру представления назначения» в переходе в методе «prepareForSegue:».

Что происходит, так это то, что вы создаете экземпляр контроллера представления, устанавливаете изображение, затем… оно выбрасывается и игнорируется (весь vc).

Затем вы инициируете переход, который iOS обрабатывает, создавая экземпляр другого, другого контроллера представления. Именно этот контроллер представлений представляет iOS.

Итак: если вы собираетесь использовать переход к раскадровке, iOS создаст для вас экземпляр VC. Не создавайте экземпляр самостоятельно, потому что невозможно связать созданный вы экземпляр с обработкой перехода iOS. Тот, который вы создаете, является нерелевантным дополнением, которое игнорируется.

person Bill Patterson    schedule 17.01.2014
comment
Потрясающий. Отличное объяснение. Вот что я искал! - person smallTeamCraft Development; 17.01.2014