как передать информацию из viewcontroller Objective-C в раскадровку Swift - PullRequest
0 голосов
/ 28 марта 2019

Я начал работать в проекте, который уже был запущен в ObjectiveC и без раскадровки.Я делаю новые разделы в 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?


И в контейнере ViewView я показываю другой viewController, где я притворяюсь, что показываю изображение.

Я пытался изменить код, который я использую для навигации поthis

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

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

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

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

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

Просмотр контроллерапосмотреть скриншот розетки

0 голосов
/ 28 марта 2019

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

Но ваша ошибка говорит о том, что [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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...