1
votes

Comment passer des données (dictionnaire) du contrôleur Objective-C dans Swift `viewcontroller` tout en utilisant bridging-header? Y-a t'il une autre possibilité?

Je souhaite envoyer un dictionnaire du contrôleur Objective-C au contrôleur Swift. J'ai essayé d'utiliser le mot clé @ obj-c , Public dans le contrôleur Swift, mais je n'ai pas pu accéder.

Code 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.

Ici, je veux accéder à la variable "selectedDirectory" pour envoyer la valeur du dictionnaire.

Code Swift:

@objc class vc_listing_list: UIViewController {

   var selectedDirectory: Dictionary<String, String>

}

J'attends mon code dans le contrôleur objectif c:

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

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


0 commentaires

3 Réponses :


0
votes

ajoutez @objcMembers au fichier swift

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

si vous utilisez le storyboard, vous n'avez pas besoin d'initialiser comme ça

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

vous pouvez utiliser directement comme ceci

@objcMembers class vc_listing_list: UIViewController {

var selectedDirectory: Dictionary

}

Essayez également de corriger votre convention de dénomination de classe et d'objet. merci


2 commentaires

Merci. Je peux accéder à cette variable en utilisant @objcMembers et je n'utilise pas de storyboard, via le code uniquement ma conception.


Cela devrait être marqué comme la bonne réponse. Une autre façon de le faire serait de déclarer explicitement selectedDictionary comme @objc . Les deux méthodes permettent à la propriété Swift d'être visible par Objective-C, ce que vous souhaitez.



-2
votes

Il existe plusieurs façons de transmettre des données de l'objectif c à la classe swift.

1) en utilisant NSUserDefault

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];

puis obtenir les données en classe swift

XXX

2) Utilisation de l'objet de création directe de la classe swift.

var dic : [[String:Any]]!

passer le dict comme celui-ci

NSMutableDi p >

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


2 commentaires

Merci beaucoup. J'ai eu l'idée de transmettre les données de l'objectif c au contrôleur de vue rapide. c'est très utile.


La transmission de données entre objets à l'aide de UserDefaults est compliquée, obscure et difficile à documenter. Merci de ne pas faire ça.



0
votes

Pour accéder à une classe Objective-C depuis Swift, vous devez l'ajouter à l'en-tête de pontage. L'en-tête de pontage est normalement nommé d'après le nom de votre cible, par exemple MyApp-BridgingHeader.h

Vous importez les en-têtes dont vous avez besoin pour Swift dans l'en-tête de pontage:

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

De là, vous pouvez accéder au classe depuis Swift.

let controller = VCListingList()

Donc, pour votre problème, vous devrez exposer le selectedDirectory dans l ' En-tête en tant que propriété avec des types de pontage de .

Ce serait votre choix de le rendre facultatif en utilisant nullable . Si vous ne voulez pas qu'elle soit facultative , vous devez initialiser la propriété avant de la lire dans Swift.

#import "VCListingList.h" 

Note de style: n'utilisez pas de minuscules pour les noms de classe. Cela les rend faciles à confondre avec les variables. Donc, VCListingList est préférable à vc_listing_list[

Vous pouvez lisez la documentation pour plus d'informations


0 commentaires