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

Я начал работать над проектом, который уже был запущен на ObjectiveC и без Storyboard. Я создаю новые разделы в Swift и с помощью Storyboard, но теперь у меня возникла проблема, когда я пытаюсь передать информацию (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];

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

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

Спасибо заранее

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

Scriptable 28.03.2019 11:10

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

Fattie 28.03.2019 11:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я попытался воспроизвести вашу проблему с тем, как вы реализовали, и у меня это сработало.

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

[addExpenseStoryboard 
     instantiateViewControllerWithIdentifier:@"expenseNavController"]

поэтому ваш createExpenseVC на самом деле имеет тип контроллера навигации, а не CreateExpenseViewController.

И именно поэтому он не получает изображение расхода.

Вот где твоя проблема

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

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];

О, я вижу, если я делаю навигацию непосредственно к viewController, она работает, но тогда я теряю панель навигации, которая мне нужна. CreateExpenseVC встроен в CustomNavController по раскадровке, поэтому в коде CustomNavController у меня есть только код для настройки представления...

emelagumat 28.03.2019 12:02

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

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

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

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

Скриншот выхода View Controller View

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

emelagumat 28.03.2019 12:05

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

Philip Borbon 28.03.2019 12:17

Другие вопросы по теме