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

Я хочу отправить словарь из контроллера 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>

}

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

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

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

Ответы [ 3 ]

0 голосов
/ 12 апреля 2019

Существует несколько способов передачи данных из цели 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]]!

pass 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];
0 голосов
/ 30 апреля 2019

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

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

#import "VCListingList.h" 

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

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

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

0 голосов
/ 12 апреля 2019

добавить @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];

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

...