Как передать данные (словарь) из контроллера Objective-C в Swift `viewcontroller` при использовании bridging-header? Есть ли другой способ?

#ios #objective-c #swift #bridging-header

#iOS #objective-c #swift #bridging-header

Вопрос:

Я хочу отправить словарь с контроллера Objective-C в контроллер Swift. Я пытался использовать ключевое @obj-c слово Public в контроллере Swift, но не смог получить доступ.

Код Objective-C:

     vc_listing_list *swiftController = [[vc_listing_list alloc] init];

    swiftController = (vc_listing_list *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID];
  

Здесь я хочу получить доступ "selectedDirectory" к переменной для отправки значения словаря.

Код Swift:

 @objc class vc_listing_list: UIViewController {

   var selectedDirectory: Dictionary<String, String>

}
  

Я ожидаю, что мой код в контроллере objective c:

 vc_listing_list *swiftController = [[vc_listing_list alloc] init];

swiftController = (vc_listing_list *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID];
swiftController.selectedDirectory = someDictionary;  // this line am expecting.
  

Ответ №1:

добавить @objcMembers в файл swift

 @objcMembers class vc_listing_list: UIViewController {

var selectedDirectory: Dictionary

}
  

если вы используете раскадровку, вам не нужно инициализировать так

 vc_listing_list *swiftController = [[vc_listing_list alloc] init];
  

вы можете напрямую использовать вот так

   vc_listing_list * swiftController = [storyboard instantiateViewControllerWithIdentifier:@"viewControllerID"];
  swiftController.selectedDirectory = someDictionary
  [self.navigationController pushViewController:swiftController animated:YES];
  

Пожалуйста, попробуйте также исправить свое соглашение об именовании классов и объектов.
Спасибо

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

1. Спасибо. Я могу получить доступ к этой переменной с помощью @objcMembers и не использую раскадровку, используя код только моего дизайна.

2. Это должно быть отмечено как правильный ответ. Другим способом сделать это было бы явно объявить selectedDictionary as @objc . Оба метода приводят к тому, что свойство Swift становится видимым для Objective-C, чего вы и хотите.

Ответ №2:

Чтобы получить доступ к классу Objective-C из Swift, вам нужно добавить его в заголовок bridging. Заголовок bridging обычно называется в честь вашего целевого имени, например MyApp-BridgingHeader.h

Вы импортируете любые заголовки, которые вам нужны для Swift, в заголовок bridging:

 #import "VCListingList.h" 
  

Оттуда вы можете получить доступ к классу из Swift.

 let controller = VCListingList()
  

Итак, для вашей проблемы вам нужно будет указать selectedDirectory в заголовке как свойство в комплекте с типами мостов <NSString *,NSString *> .

Это был бы ваш выбор, чтобы использовать его Optional nullable . Если вы не хотите, чтобы это было Optional , вы должны инициализировать свойство перед его чтением в Swift.

 NS_ASSUME_NONNULL_BEGIN

@interface VCListingList: UIViewController 

@property (nonatomic, strong, nullable) NSDictionary<NSString *,NSString *>* selectedDictionary;

//the rest of your header stuff

@end

NS_ASSUME_NONNULL_END
  

Примечание по стилю: не используйте нижний регистр для имен классов. Это позволяет легко путать их с переменными. Таким образом, VCListingList предпочтительнее vc_listing_list

Вы можете прочитать документацию для получения дополнительной информации

Ответ №3:

Существует несколько способов передачи данных из objective c в класс swift.

1) использование NSUserDefault

 NSMutableDictionary *dic = [[NSMutableDictionary  alloc] init];

[dic addObject:@"sss" forKey:@"hi"];
[dic addObject:@"eee" forKey:@"hr"];
[NSUserDefaults standardDefaults] setObject:dic forKey:@"DicKey"];
[[NSUserDefaults standardDefaults] synchronize];
  

затем получить данные в классе swift

 let dic = NSUserDefaults.standard.string(forKey: "DicKey")
  

2) Использование прямого создания объекта класса swift.

 var dic : [[String:Any]]!
  

передать dict следующим образом

NSMutableDi

 ctionary *dic = [[NSMutableDictionary  alloc] init];
[dic addObject:@"sss" forKey:@"hi"];
[dic addObject:@"eee" forKey:@"hr"];

SwiftViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"SwiftViewController"];
  SwiftViewController.dict = dict
  [self.navigationController pushViewController:vc animated:YES];
  

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

1. Большое вам спасибо. у меня появилась идея передать данные из objective c в swift viewcontroller. это очень полезно.

2. Передача данных между объектами с использованием UserDefaults запутана, неясна и сложна для документирования. Пожалуйста, не делайте этого.