Я начал работать над проектом, который уже был запущен на 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 и так далее...
Итак, как я могу передать такую информацию?
Спасибо заранее
Не связанный с вашим вопросом: я бы, честно говоря, просто выбросил старый код ObjC, который не основан на раскадровке. Это абсолютная пустая трата времени. Создание идеальной современной раскадровки для данной сцены занимает несколько минут. (Тем более, что похоже, что вы имеете дело с камерами, просто выбросьте старый код ObjC. Пустая трата времени.)





Я попытался воспроизвести вашу проблему с тем, как вы реализовали, и у меня это сработало.
Но ваша ошибка говорит о том, что [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 у меня есть только код для настройки представления...
При решении этой проблемы я бы проверил несколько вещей.
Посмотрите на этот снимок экрана для визуального руководства:
Посмотреть скриншот инспектора идентификации контроллера
Скриншот выхода View Controller View
если я не пытаюсь передать какие-либо данные, это делает навигацию хорошей. Он загружает navController и первый viewController, установленный для этой навигации. Проблема возникает, когда я пытаюсь передать некоторые данные в viewController из-за navController.
Вы можете попробовать поместить UINavigationController поверх текущего контроллера, а затем вместо [self presentViewController: createExpenseVC animated: YES completion: nil]; использовать [navigationController pushViewController:vc animated:true];.
откуда взялся «CustomNavController»? Ваш код этого не показывает