【问题标题】:Call Swift ViewController from Obj C didSelectionRow从 Obj C didSelectionRow 调用 Swift ViewController
【发布时间】:2015-07-11 20:03:07
【问题描述】:

我有一个 Obj C 项目,我添加了一个 Swift viewController。

我正在尝试将情节提要附加到 viewController。

我可以以编程方式将内容添加到视图中,但无法显示情节提要。

我还尝试使用 xib 作为 Swift viewController 的竞争者,但没有成功。

从 didSelectRowAtInexPath 调用 Swift vie 表单 Obj C:

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.
    }
}

故事板连接正确:

这是我每次得到的:

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

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

【问题讨论】:

    标签: objective-c swift uiviewcontroller storyboard


    【解决方案1】:

    使用情节提要有两种基本方法:

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

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

      • 使用情节提要instantiateViewControllerWithIdentifier 来实例化目标视图控制器;和

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

      因此:

      SwiftController *sc = [self.storyboard instantiateViewControllerWithIdentifier:@"SwiftControllerScene"];
      [self.navigationController pushViewController:sc animated:YES];
      
    2. 或者,当使用情节提要时,与其手动实例化目标的视图控制器然后调用pushViewController,我更愿意在视图控制器之间的情节提要中设置一个segue(请参阅https://stackoverflow.com/a/27650207/1271826)。然后我会以编程方式执行转场(当然,参考你给转场的故事板标识符):

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

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

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

    【讨论】:

    • 两个答案都是正确的。但是因为这个教会了我一些额外的东西,所以我选择了这个。感谢 Rob、Sergey 和 Schemetrical!
    • 有趣的是,当我使用这个解决方案时,我现在在运行时得到“Interface Builder 文件中的未知类 SwiftController”。我放置在情节提要中的任何对象都会显示出来,但是当我尝试在 .swift 文件中连接它们时,我会得到可怕的“不符合键值”错误。此外,情节提要的模块是“无”,但更改它并没有帮助。所以我一直无法找到答案。任何想法为什么会发生这种情况?
    • 我会确保 SwiftController 类包含在该目标的编译源中。但我刚刚做了一个测试 Objective-C 项目并添加了一个带有 Swift 视图控制器的场景,它运行良好。所以我不知道问题可能是什么。
    【解决方案2】:

    因为在这种情况下,您正在初始化一个新的SwiftController,而不是使用情节提要中的那个。您将需要对新故事板 vc 执行 segue 或从

    获取 vc
    self.storyboard.instantiateViewControllerWithIdentifier(_controller id_)
    

    【讨论】:

      【解决方案3】:

      如果你为你的 swift viewController 使用 xib,你必须像这样初始化它:

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

      其中 SwiftController 也是您的 xib 的名称。

      我在 iOS 8 中注意到了这个问题,但是当您像这样初始化控制器时,它在 iOS 9 和 iOS 10 中正常工作:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多