我正在使用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)
}
2条答案
按热度按时间6qftjkof1#
由于您已经创建了
MessagesViewController
,因此不需要显式地将messageInputBar
添加到视图的底部。我们来看一下MessageKit的源代码
由于
messageInputBar
已经在库中设置,因此应该从源代码中删除以下代码部分。现在你的假设是
每当我在这个视图控制器中点击messageInputBar的文本字段,然后点击后退按钮时,当应用程序返回到上一个UIViewController时,messageInputBar仍留在屏幕上。
无论何时,只要有一个对象与您交互(例如
messageInputBar
),并且在您解除视图控制器后它没有被释放(仍在视图中),就有一个memory leak
。如果你反复地进入和关闭视图控制器,你会发现应用程序的内存使用量增加了,所以,找出是哪个对象创建了这个
retain cycle
,应该可以解决这个问题。xytpbqjk2#
我用Cocoapods安装了MessageKit,后来发现他们放弃了对Cocoapods的支持。所以我把我的整个项目完全迁移到Swift Package Manager,以获得最新的MessageKit,其中包括在他们的代码中设置输入栏。不知道为什么他们会发布一个最初没有这个的版本?无论如何,解决了我的问题!