从 Obj C didSelectionRow 调用 Swift ViewController

add*_*dzo 3 objective-c storyboard uiviewcontroller swift

我有一个 Obj C 项目,我已经向其中添加了一个 Swift viewController。

我正在尝试将故事板附加到 viewController。

我可以以编程方式向视图添加内容,但无法显示故事板。

我还尝试使用 xib 作为 Swift viewController 的竞争,但没有运气。

从 didSelectRowAtInexPath 调用 Swift vie form Obj C:

SwiftController *sc = [[SwiftController alloc] init];
[self.navigationController pushViewController:sc animated:YES];
Run Code Online (Sandbox Code Playgroud)

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

故事板正确连接:

1

2

这就是我每次得到的:

3

使用 xib 会发生相同的结果。

Apple Docs 和网络上以及 SO 上有很多东西可以处理“围绕”这个问题的许多问题,但我没有找到任何可以帮助我了解我在这里做错了什么的东西。以行之有效的方式做事或 Obj C 似乎行不通。显然,我是 Swift 的菜鸟。任何帮助都会很棒。谢谢。

Rob*_*Rob 5

使用故事板时有两种基本方法:

  1. 当您的 Objective-C 代码需要转换到故事板中的另一个场景时,您可以:

    • SwiftControllerScene在 Interface Builder 中为该目标场景提供一个故事板 ID(例如);

    • 使用故事板instantiateViewControllerWithIdentifier实例化该目标视图控制器;和

    • 过渡到那个新场景(即推送或呈现该视图控制器)。

    因此:

    SwiftController *sc = [self.storyboard instantiateViewControllerWithIdentifier:@"SwiftControllerScene"];
    [self.navigationController pushViewController:sc animated:YES];
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者,当使用故事板时pushViewController,我宁愿在故事板中的视图控制器之间设置一个 segue ,而不是手动实例化目标的视图控制器然后调用(参见/sf/answers/1935514521/) . 然后我会以编程方式执行转场(当然,参考您为转场提供的任何故事板标识符):

    [self performSegueWithIdentifier:@"SegueToSwiftScene" sender:self];
    
    Run Code Online (Sandbox Code Playgroud)

    这样,故事板继续代表应用程序的视觉流程。

请注意,目标场景的视图控制器是用 Swift 和 Objective-C 编写的这一事实在很大程度上是无关紧要的。问题仅仅是源视图控制器使用什么语言(因此上面的例子是在 Objective-C 中的),并且无论目标视图控制器的语言如何,过程在其他方面基本相同。