Call Swift ViewController from Obj C didSelectionRow

I have an Obj C project to which I have added a Swift viewController.

I am trying to attach a storyboard to a viewController.

I can programmatically add things to the view, but I cannot get the storyboard to appear.

I also tried using xib as vie for Swift viewController with no luck.

Calling Swift vie Obj C form from didSelectRowAtInexPath file:

SwiftController *sc = [[SwiftController alloc] init];
[self.navigationController pushViewController:sc animated:YES];

      

SwiftController.swift:

import Foundation
import UIKit

@objc class SwiftController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

        // This prints
        println("in the scrolling view")
        // This works
        self.view.backgroundColor = .redColor();
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

      

The storyboard is correctly connected:

1

2

And this is what I get every time:

3

The same results occur with xib.

There are a lot of things in the Apple Docs and on the internet, and here on SO, that address a lot of issues around this, but I haven't found anything to help me figure out what I'm doing wrong here. Doing what works, or Obj C doesn't seem to work. Clearly I'm a nob with Swift. Any help would be great. Thank.

+3


source to share


3 answers


There are two main approaches when using storyboard:

  • If you have Objective-C code that needs to transition to a different scene in the storyboard, you can:

    • specify in the target string the storyboard ID (for example SwiftControllerScene

      ) in Interface Builder;

    • use a storyboard instantiateViewControllerWithIdentifier

      to instantiate this view controller; and

    • transition to this new scene (i.e. click or present this view controller).

    Thus:

    SwiftController *sc = [self.storyboard instantiateViewControllerWithIdentifier:@"SwiftControllerScene"];
    [self.navigationController pushViewController:sc animated:YES];
    
          

  • Alternatively, when using a storyboard rather than manually instantiating the view manager and then invoking it pushViewController

    , I would rather set up a segue in the storyboard between view controllers (see fooobar.com/questions/929949 / ... ). Then I did the segue programmatically (referencing, of course, whatever storyboard id you gave the segue):

    [self performSegueWithIdentifier:@"SegueToSwiftScene" sender:self];
    
          

    In this way, the storyboard continues to represent the visual flow of the application.



Please note that the fact that the destination scene view controller is written in Swift vs Objective-C is pretty much irrelevant. The only question is what language the source view controller is in (hence the above examples are in Objective-C) and otherwise the process will be pretty much the same regardless of the target view controller language.

+4


source


Because in this case, you are initializing a new one SwiftController

instead of using one from the storyboard. You will want to either segue into a new vc storyboard or get vc from



self.storyboard.instantiateViewControllerWithIdentifier(_controller id_)

      

+1


source


in case you are using xib for your quick viewController you should initialize it like this:

SwiftController* controller = [[SwiftController alloc]  initWithNibName:@"SwiftController" bundle:nil]

      

Where SwiftController is also the name of your xib.

I notice this issue in iOS 8, but it works fine in iOS 9 and iOS 10 when you start the controller just like this:

SwiftController* controller = [[SwiftController alloc]  init];

      

+1


source







All Articles