无法从 Objective-C 视图控制器访问 Swift var - iOS

Posted

技术标签:

【中文标题】无法从 Objective-C 视图控制器访问 Swift var - iOS【英文标题】:Cannot access Swift var from Objective-C View controller - iOS 【发布时间】:2016-02-02 10:27:23 【问题描述】:

我有一个包含基于 Objective-C 和 Swift 的视图控制器的应用程序。我正在从我的一个基于 Objective-C 的视图控制器中以编程方式打开一个基于 Swift 的视图控制器。我遇到的问题是我无法从我的 Objective-C 代码中访问 Swift 变量。

我的 Swift 代码:

@IBOutlet weak var profPicture: UIImageView!
@IBOutlet weak var profVerified: UIImageView!
@IBOutlet weak var profName: UILabel!
var passedUser:PFUser!

我的 Objective-C 代码:

MyProfileViewController *screen = [[MyProfileViewController alloc] initWithNibName:@"Main" bundle:nil];
self.dataPass = screen;
dataPass.profName.text = @"";
screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:screen animated:YES completion:nil];

我可以访问像 IBOutlets 这样的 @ 属性,但我无法访问和编辑 var 对象。

我这样做是因为在展示基于 Swift 的视图控制器时,我想将数据从基于 Objective-C 的视图控制器传递到基于 Swift 的视图控制器中。

为什么我不能访问 var 对象?

这是我得到的错误:

错误如下:

在类型的对象上找不到属性“passedUser” 'MyProfileViewController *'

感谢您抽出宝贵时间,丹。

【问题讨论】:

您在哪一行出现错误?错误信息是什么? @Sulthan 我更新了我的问题。 你没有声明它们public @HermannKlecker 现在试过了,还是报同样的错误。 @Sulthan 请重新发布您的原始答案,它确实有效,我只是遇到了一些 Xcode 缓存问题。所以我清理了 Xcode 和我的项目并再次尝试了你的答案,它成功了! 【参考方案1】:

您需要使用@objc public 将变量公开给Objective-C:

@IBOutlet @objc public weak var profName: UILabel!

【讨论】:

【参考方案2】:

有了这些答案,有时编译器不会为我们的 swift 代码生成合适的 obj-c 代码。在这种情况下,

只需清理并构建项目。

【讨论】:

【参考方案3】:

斯威夫特 4:

使用 @objc 关键字访问 swift 变量。

class Car: NSObject 
    @objc let name: String
    @objc let numberOfWheels: Int
    let manufacturer: String

【讨论】:

【参考方案4】:

我在 ObjectiveC 枚举中遇到了同样的问题,它是 Swift 类中的一个变量,在 ObjectiveC 中无法访问。

将变量声明为 public 不起作用,相反,我必须在声明它时给枚举一个默认值,以便将它包含在 [project]-Swift.h 标头中。

 var firstQuestion: AnswerResult = AnswerNone

以下操作无效:

var firstQuestion: AnswerResult!

【讨论】:

【参考方案5】:

您必须将变量声明为public

默认情况下,变量具有internal 访问权限,这意味着只能从其模块内部访问它们。 Obj-C 代码不在他们的模块中。

【讨论】:

以上是关于无法从 Objective-C 视图控制器访问 Swift var - iOS的主要内容,如果未能解决你的问题,请参考以下文章

在objective-c中使用swift代码时的问题

参考从模态(objective-c)呈现视图控制器

Objective-C – 从应用程序委托向视图控制器发送消息

无法从另一个视图控制器更改 UILabel 的文本

从 Swift 的 Objective-c 基础视图控制器继承

如何从objective-c类推送一个快速视图控制器并将数据传回并继续objective-c类中的下一个过程