21

I have an app with both Objective-C and Swift based view controllers. I am programatically opening a Swift based view controller from one of my Objective-C based view controllers. The problem I am having is that I can't access the Swift variables from my Objective-C code.

My Swift code:

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

My Objective-C code:

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

I am able to access @ properties like IBOutlets, but I can't access and edit the var objects.

I am doing this, because I want to pass data into the Swift based view controller from the Objective-C based view controller when I am presenting the Swift based view controller.

Why can't I access the var objects?

Here is the error I am getting:

enter image description here

The error is as follows:

Property 'passedUser' not found on object of type 'MyProfileViewController *'

Thanks for your time, Dan.

6
  • On which line are you getting an error? What is the error message? Commented Nov 2, 2015 at 13:58
  • @Sulthan I updated my question. Commented Nov 2, 2015 at 14:01
  • You did not declare them public. Commented Nov 2, 2015 at 14:02
  • @HermannKlecker Tried that now, and it still comes up with the same error. Commented Nov 2, 2015 at 14:05
  • 1
    @Sulthan Please repost your original answer, it the end it DID work, I was just having some Xcode cache issues. So I cleaned Xcode and my project and tried your answer again and it worked! Commented Nov 2, 2015 at 14:28

5 Answers 5

25

Swift 4:

Use @objc keyword to access the swift variable.

class Car: NSObject {
    @objc let name: String
    @objc let numberOfWheels: Int
    let manufacturer: String
}
Sign up to request clarification or add additional context in comments.

Comments

11

You will have to declare the variable as public.

By default, the variables have internal access, that means they can be accessed only from inside their module. Obj-C code is not in their module.

Comments

8

I had the same issue with an ObjectiveC enum, that was a variable in a Swift class and wasn't accessible in ObjectiveC.

Declaring the variable as public didn't work, instead I had to give the enum a default value when declaring it, for it to be included in the [project]-Swift.h header.

 var firstQuestion: AnswerResult = AnswerNone

The following didn't work:

var firstQuestion: AnswerResult!

Comments

1

With these all answers, sometimes compiler doesn't generate appropriate obj-c code for our swift code. In that case,

Just clean & build project.

Comments

-1

You need to use @objc public for the variable to expose it to Objective-C:

@IBOutlet @objc public weak var profName: UILabel!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.