#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
запутана, неясна и сложна для документирования. Пожалуйста, не делайте этого.