【问题标题】:Xcode: didTransition to Won't Run in iMessage ExtensionXcode:didTransition 不会在 iMessage 扩展中运行
【发布时间】:2021-07-24 21:22:50
【问题描述】:

我正在制作一个使用 didTransition(to:) 的 iMessage 扩展程序。但是,当我在模拟器中调整 iMessage 扩展的大小时,该功能不会运行。我做错了吗?

这是我的代码:

import UIKit
import Messages

class EditorViewController: MSMessagesAppViewController {
    @IBOutlet weak var input: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        input.text = "not changed"
    }

    // This part isn't working:

    override func didTransition(to presentationStyle: MSMessagesAppPresentationStyle) {
        input.text = "changed"
    }
}

当我在模拟器中调整它的大小时,什么也没有发生。 input.text 更改 UITextViewviewDidLoad() 函数中的文本,但不会在 didTransition(to) 函数中,因为它永远不会运行。

我做错了吗?

EditorViewController 是由show (e.g. Push) segue 提供的视图控制器,并附有NavigationController

这是一个没有变化的 gif:


输入的文本永远不会改变

我该如何解决这个问题?

编辑:当视图控制器嵌入导航控制器时,willTransitiondidTransition 函数不会运行。有没有办法来解决这个问题? (它可以在没有导航控制器的情况下工作,但我需要此项目的导航控制器)。

【问题讨论】:

  • 尝试使用打印并告诉我们打印时会发生什么
  • @Evergreen 我试过这个,当我调整它的大小时什么都没有打印出来。
  • 这是一个困境!尝试使用willTransition(),如果不起作用,请尝试在viewDidLoad() 中使用self.presentationStyle,看看它是否发生了变化,如果是,请调用一个新函数来执行您想要的任何操作。
  • @Evergreen 我试过willTransition(),它也没有运行。你认为这可能是因为它不是主视图控制器,而是使用show segue 和performSegue 函数呈现的? 编辑:我创建了一个空白 Xcode 项目,它似乎在那个项目中工作。不知道为什么它不会在其他项目中运行。
  • @Evergreen 我创建了一个新项目并意识到由于某种原因,当 ViewController 嵌入导航控制器时,willTransition and didTransition` 函数不会运行。不过,我找不到任何解决方法,也找不到任何可能发生这种情况的原因。

标签: swift xcode imessage imessage-extension msmessage


【解决方案1】:

正如answer 中所指出的,iMessage App 的入口点必须是 MSMessagesAppViewController 的子类,因此在 Apple 添加对此行为的支持之前,您不能直接将 NavigationViewController 用作根控制器。

但按照建议,您可以通过以下解决方法解决此问题:

import UIKit
import Messages

class MyRootVC: MSMessagesAppViewController {
    var navVC: UINavigationViewController!
    var editorVC: EditorViewController!
    
    func viewDidLoad() {
        super.viewDidLoad()

        editorVC = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as! EditorViewController
    
        navVC = UINavigationController(rootViewController: editorVC)
        self.addChild(navVC)
        self.view.addSubview(navVC.view)
        navVC.didMove(toParent: self)
    }

    override func didTransition(to presentationStyle: MSMessagesAppPresentationStyle) {
        editorVC.input.text = "changed"
    }
}

class EditorViewController: UIViewController {
    @IBOutlet weak var input: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
    
        input.text = "not changed"
    }
}

【讨论】:

    猜你喜欢
    • 2017-03-24
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2017-04-19
    • 2018-07-30
    • 2017-02-15
    相关资源
    最近更新 更多