如何从Objective C传递数据到Swift?

4
你怎样将数据对象从 Objective C 文件传递到 Swift 文件?
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

    if([[segue identifier] isEqualToString: @"details"]){
    //create the swift file and set the property I want to pass here


    }

}

在 Swift 视图中:
import Foundation
import UIKit
import CoreLocation


public class SwiftViewController: UIViewController{

    var passedObject:NPSCustomObject!

    public override func viewDidLoad() {

    }

1
你尝试过桥接头文件吗? https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html - Moonhead
我知道如何将头文件添加到桥接文件中,以便我可以在Swift文件中访问它们,那么我是在这里从Objective-C传递对象到Swift吗? - Nathan
3个回答

8

我更喜欢使用NotificationCenter:

Objective-C转Swift

Objective-C

NSDictionary *myData = @{@"data1" : @"value1", @"data2": @"value2"};
[[NSNotificationCenter defaultCenter] postNotificationName:@"myNotificationName" object:nil userInfo:myData];

Swift

NotificationCenter.default.addObserver(forName:NSNotification.Name(rawValue: "myNotificationName"), object:nil, queue:nil, using:yourFunction)

func yourFunction(notification:Notification) -> Void {
 if let extractInfo = notification.userInfo {
             print(" my data: \(extractInfo["data1"])");
        }
    }

6
我发现了一种天真的方法,可以使用NSUserDefaults保存数据:
Objective-C类:
NSString *myObjcData = @"from Objective-C";

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setValue:myObjcData forKey:@"data"];
[defaults synchronize];

Swift类:
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()

override func viewDidLoad() {

    super.viewDidLoad()

    // Receive data ---> with NSUserdefaults
    let mySwiftData: AnyObject? = prefs.valueForKey("data")
    println("data is \(mySwiftData)")

}

这不是很优雅,但我保证它可以工作!希望能有所帮助。

有点晚了,但是你也需要一个通知来指示更改已经完成了吗? - ICL1901
这当然会起作用,但绝对很糟糕。 - Alper

5
如果在Storyboard中将“details”segue设置为传递到类型为SwiftViewController的视图控制器(对于你暗示的工作流程应该是这样),则不需要创建后者 - segue已经为你完成了。你可以在prepareForSegue中访问它,如segue.destinationViewController
假设你的项目已经使用正确的头文件将Swift与(Obj)C桥接, 你只需要将segue.destinationViewController转换为你正在使用的类型,以便可以访问其成员。例如:
if([[segue identifier] isEqualToString: @"details"]){
    SwiftViewController *vc = (SwiftViewController *)segue.destinationViewController;
    vc.passedObject = // put your instance of NPSCustomObject here
}

3
不是桥接头文件。那是由 Swift 代码与 Objective-C 代码交互使用的。这是另一种情况,他的 Objective-C 代码需要 #import "ProductModuleName-Swift.h",这是系统为他的 Swift 对象生成的头文件。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接