как передать информацию из viewcontroller Objective-c в раскадровку Swift

#objective-c #swift #xcode

#objective-c #swift #xcode

Вопрос:

Я начал работать в проекте, который уже был запущен в ObjectiveC и без раскадровки. Я создаю новые разделы в Swift и с помощью раскадровки, но теперь у меня возникает проблема, когда я пытаюсь передать информацию (UIImage) контроллерам моей раскадровки. Вот как я перехожу к ViewControllers:

 -(void)expenseCamera:(VOCCustomCameraVC *)camera didFinishPickImage:(UIImage *)
                       image imageCreated:(NSString *)imageCreated 
                       fileName:(NSString *)fileName {

    [camera dismissViewControllerAnimated: YES completion: nil];

         UIStoryboard *addExpenseStoryboard = [UIStoryboard 
                                             storyboardWithName:@"addExpense" bundle:nil];
         CreateExpenseVC *createExpenseVC = [addExpenseStoryboard 
         instantiateViewControllerWithIdentifier:@"expenseNavController"];
         UIImage *compressedImage = [UIImage compressImage: image];
         createExpenseVC.expenseImage = compressedImage; // It crashes here





    //createExpenseVC.delegate = self;
    [self presentViewController: createExpenseVC animated: YES completion: nil];
    CFRunLoopWakeUp(CFRunLoopGetCurrent());
}
  

Если я удаляю createExpenseVC.expenseImage = compressedImage , все идет хорошо, но когда я пытаюсь передать изображение, я получаю эту ошибку:

 SIGABRT *** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '-[YourApp.CustomNavController setExpenseImage:]: unrecognized selector
 sent to instance 0x12e09b200'
  

Конечный ViewController запускается таким образом

 @objcMembers class CreateExpenseVC: UIViewController {


   /* ---- IBOutlets ---- */
    @IBOutlet weak var containerView: UIView!
    @IBOutlet weak var backButton: UIBarButtonItem!
    @objc var expenseImage: UIImage?


  

И в containerView я показываю другой ViewController, где я делаю вид, что показываю изображение.

Я попытался изменить код, который я использую для перехода к этому

 CreateExpenseVC * createExpenseVC = [[CreateExpenseVC alloc] init];
  

Но это также приводит к сбою, потому что (я думаю) он не создает экземпляр Storyboard и, следовательно, не распознает все IBOutlets и так далее…

Итак, как я могу передать такую информацию?

Заранее большое спасибо

Комментарии:

1. откуда берется «CustomNavController»? Ваш код этого не показывает

2. Не имеет отношения к вашему вопросу: я бы, честно говоря, просто выбросил старый код ObjC, который не основан на раскадровке. Это абсолютная трата времени. Создание идеальной современной раскадровки для данной сцены занимает минуты. (В частности, поскольку похоже, что вы имеете дело с камерами, просто выбросьте старый код ObjC. Пустая трата времени.)

Ответ №1:

Я попытался воспроизвести вашу проблему с помощью того, как вы реализовали, и у меня все отлично получилось.

Но в вашей ошибке указано, что [YourApp.CustomNavController setExpenseImage:] не реализован. Это означает, что ваш контроллер просмотра встроен в навигационный контроллер. И вы пытаетесь получить навигационный контроллер с помощью этого кода

 [addExpenseStoryboard 
     instantiateViewControllerWithIdentifier:@"expenseNavController"]
  

итак, ваш createExpenseVC на самом деле имеет тип Navigation controller, а не CreateExpenseViewController.

И именно поэтому он не получает expenseImage.

Вот в чем заключается ваша проблема

Вот что вы можете сделать..

 UIStoryboard *addExpenseStoryboard = [UIStoryboard storyboardWithName:@"CreateExpense" bundle:nil];
UINavigationController *navController = [addExpenseStoryboard instantiateViewControllerWithIdentifier:@"ExpenseNavC"];
CreateExpenseViewController *createExpenseVC = navController.viewControllers[0];
UIImage *image = [UIImage imageNamed:@"383975"];

createExpenseVC.expenseImage = image;
[self presentViewController: navController animated: YES completion: nil];
  

Комментарии:

1. О, я вижу, если я создам навигацию непосредственно к ViewController, это сработает, но тогда я потеряю панель навигации, которая мне нужна. CreateExpenseVC встроен в CustomNavController с помощью storyboard, поэтому в коде CustomNavController у меня есть только некоторый код для настройки представления…

Ответ №2:

При решении этой проблемы я бы проверил несколько вещей.

  • Назначен ли идентификатор storyboard?
  • Назначен ли правильный класс UIViewController?
  • Имеет ли UIViewController выход для просмотра?

Проверьте эти скриншоты для визуального руководства:

Скриншот инспектора идентификации контроллера просмотра

Просмотреть скриншот выхода контроллера просмотра

Комментарии:

1. если я не пытаюсь передавать какие-либо данные, это улучшает навигацию. Он загружает NavController и первый ViewController, настроенный на эту навигацию. Проблема возникает, когда я пытаюсь передать некоторые данные ViewController из-за NavController

2. Вы можете попробовать поместить UINavigationController поверх текущего контроллера, а затем вместо [self presentViewController: createExpenseVC animated: YES completion: nil]; использовать [navigationController pushViewController:vc animated:true]; .