ios 当我关闭我的消息视图控制器时,消息输入栏没有关闭(MessageKit,请求帮助!)

ercv8c1e  于 2023-02-10  发布在  iOS
关注(0)|答案(2)|浏览(96)

我正在使用MessageKit。我创建了一个MessageViewController。我添加了messageInputBar作为viewDidLoad的子视图,沿着一个包含后退按钮的导航栏。每当我在这个视图控制器中点击messageInputBar的文本字段,然后点击后退按钮时,当应用程序返回到上一个UIViewController时,messageInputBar将保留在屏幕上。如果我不“当我第一次进入MessagesViewController并按下back按钮时,如果不点击messageInputBar,则messageInputBar会被正确地关闭。

override func viewDidLoad() {
        super.viewDidLoad()

        setUpNavBar()

        navigationItem.largeTitleDisplayMode = .never
        maintainPositionOnKeyboardFrameChanged = true
        scrollsToLastItemOnKeyboardBeginsEditing = true

        messageInputBar.inputTextView.tintColor = .systemBlue
        messageInputBar.sendButton.setTitleColor(.systemTeal, for: .normal)

        messageInputBar.delegate = self
        messagesCollectionView.messagesDataSource = self
        messagesCollectionView.messagesLayoutDelegate = self
        messagesCollectionView.messagesDisplayDelegate = self

        loadChat()

        self.view.addSubview(messageInputBar)

        messageInputBar.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            messageInputBar.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
            messageInputBar.widthAnchor.constraint(equalToConstant: self.view.bounds.width)
        ])

        NSLayoutConstraint.activate([
            messagesCollectionView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 100)
        ])

    }

    func setUpNavBar() {
        let navBar = UINavigationBar()
        self.view.addSubview(navBar)
        navBar.items?.append(UINavigationItem(title: (selectedUser?.userFirstName)!))
        let backButton = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(backButtonTapped))
        navBar.topItem?.leftBarButtonItem = backButton

        navBar.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            navBar.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor),
            navBar.heightAnchor.constraint(equalToConstant: 44),
            navBar.widthAnchor.constraint(equalToConstant: self.view.bounds.width)
        ])
    }

    @IBAction func backButtonTapped(_ sender: Any) {
        let transition = CATransition()
        self.view.window!.layer.add(transition.segueLeftToRight(), forKey: kCATransition)

        self.dismiss(animated: false)
    }
6qftjkof

6qftjkof1#

由于您已经创建了MessagesViewController,因此不需要显式地将messageInputBar添加到视图的底部。
我们来看一下MessageKit的源代码

private func setupInputBar(for kind: MessageInputBarKind) {
    inputContainerView.subviews.forEach { $0.removeFromSuperview() }

    func pinViewToInputContainer(_ view: UIView) {
      view.translatesAutoresizingMaskIntoConstraints = false
      inputContainerView.addSubviews(view)

      NSLayoutConstraint.activate([
        view.topAnchor.constraint(equalTo: inputContainerView.topAnchor),
        view.bottomAnchor.constraint(equalTo: inputContainerView.bottomAnchor),
        view.leadingAnchor.constraint(equalTo: inputContainerView.leadingAnchor),
        view.trailingAnchor.constraint(equalTo: inputContainerView.trailingAnchor),
      ])
    }

    switch kind {
    case .messageInputBar:
      pinViewToInputContainer(messageInputBar)
    case .custom(let view):
      pinViewToInputContainer(view)
    }
  }

由于messageInputBar已经在库中设置,因此应该从源代码中删除以下代码部分。

self.view.addSubview(messageInputBar)

messageInputBar.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
            messageInputBar.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
            messageInputBar.widthAnchor.constraint(equalToConstant: self.view.bounds.width)
        ])

NSLayoutConstraint.activate([
            messagesCollectionView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 100)
        ])

现在你的假设是
每当我在这个视图控制器中点击messageInputBar的文本字段,然后点击后退按钮时,当应用程序返回到上一个UIViewController时,messageInputBar仍留在屏幕上。
无论何时,只要有一个对象与您交互(例如messageInputBar),并且在您解除视图控制器后它没有被释放(仍在视图中),就有一个memory leak
如果你反复地进入和关闭视图控制器,你会发现应用程序的内存使用量增加了,所以,找出是哪个对象创建了这个retain cycle,应该可以解决这个问题。

xytpbqjk

xytpbqjk2#

我用Cocoapods安装了MessageKit,后来发现他们放弃了对Cocoapods的支持。所以我把我的整个项目完全迁移到Swift Package Manager,以获得最新的MessageKit,其中包括在他们的代码中设置输入栏。不知道为什么他们会发布一个最初没有这个的版本?无论如何,解决了我的问题!

相关问题