Skip to content
This repository was archived by the owner on Jun 7, 2020. It is now read-only.

Commit 866c639

Browse files
committed
Refactor EmojiPickerViewController and fix memory leak on iPhone
1 parent 5a7958c commit 866c639

7 files changed

Lines changed: 39 additions & 54 deletions

File tree

Rocket.Chat/Controllers/Chat/MessagesViewControllerMessageCellProtocol.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -391,26 +391,26 @@ extension MessagesViewController {
391391
self.composerView.resignFirstResponder()
392392

393393
let controller = EmojiPickerController()
394-
controller.modalPresentationStyle = .popover
395-
controller.preferredContentSize = CGSize(width: 600.0, height: 400.0)
396-
397-
if let presenter = controller.popoverPresentationController {
398-
presenter.sourceView = view
399-
presenter.sourceRect = view.bounds
400-
presenter.backgroundColor = view.theme?.focusedBackground
401-
}
402394

403395
controller.emojiPicked = { emoji in
404396
API.current()?.client(MessagesClient.self).reactMessage(message, emoji: emoji)
405397
UserReviewManager.shared.requestReview()
406398
}
407399

408400
controller.customEmojis = CustomEmoji.emojis()
409-
ThemeManager.addObserver(controller.view)
410401

411402
if UIDevice.current.userInterfaceIdiom == .phone {
412403
self.navigationController?.pushViewController(controller, animated: true)
413404
} else {
405+
controller.modalPresentationStyle = .popover
406+
controller.preferredContentSize = CGSize(width: 600.0, height: 400.0)
407+
408+
if let presenter = controller.popoverPresentationController {
409+
presenter.sourceView = view
410+
presenter.sourceRect = view.bounds
411+
presenter.backgroundColor = view.theme?.focusedBackground
412+
}
413+
414414
self.present(controller, animated: true)
415415
}
416416
}

Rocket.Chat/Controllers/Subscriptions/SubscriptionsList/SubscriptionsViewController.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ final class SubscriptionsViewController: BaseViewController {
4848
weak var serversView: ServersListView?
4949
weak var titleView: SubscriptionsTitleView?
5050
weak var searchController: UISearchController?
51-
weak var searchBar: UISearchBar?
51+
var searchBar: UISearchBar? {
52+
return searchController?.searchBar
53+
}
5254

5355
var assigned = false
5456
var viewModel = SubscriptionsViewModel()
@@ -209,7 +211,6 @@ final class SubscriptionsViewController: BaseViewController {
209211
searchController.dimsBackgroundDuringPresentation = false
210212
searchController.hidesNavigationBarDuringPresentation = UIDevice.current.userInterfaceIdiom != .pad
211213

212-
searchBar = searchController.searchBar
213214
navigationController?.navigationBar.prefersLargeTitles = false
214215
navigationItem.largeTitleDisplayMode = .never
215216
navigationItem.searchController = searchController

Rocket.Chat/External/RCEmojiKit/Views/EmojiPicker/EmojiPicker.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ private typealias EmojiCategory = (name: String, emojis: [Emoji])
1313
final class EmojiPicker: UIView, RCEmojiKitLocalizable {
1414
static let defaults = UserDefaults(suiteName: "EmojiPicker")
1515

16-
var isPopover = false
17-
1816
var customEmojis: [Emoji] = []
1917
var customCategory: (name: String, emojis: [Emoji]) {
2018
return (name: "custom", emojis: self.customEmojis)

Rocket.Chat/External/RCEmojiKit/Views/EmojiPicker/EmojiPickerController.swift

Lines changed: 26 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -13,62 +13,50 @@ final class EmojiPickerController: UIViewController, RCEmojiKitLocalizable {
1313
var emojiPicked: ((String) -> Void)?
1414
var customEmojis: [Emoji] = []
1515

16-
private var emojiPicker: EmojiPicker! {
17-
didSet {
18-
emojiPicker.emojiPicked = { emoji in
19-
self.emojiPicked?(emoji)
20-
21-
if self.navigationController?.topViewController == self {
22-
self.navigationController?.popViewController(animated: true)
23-
} else {
24-
self.dismiss(animated: true)
25-
}
26-
}
16+
override func loadView() {
17+
view = EmojiPicker()
18+
}
2719

28-
emojiPicker.isPopover = presentationController?.presentationStyle == .popover
20+
override func viewDidLoad() {
21+
super.viewDidLoad()
2922

30-
emojiPicker.customEmojis = customEmojis
31-
}
32-
}
23+
ThemeManager.addObserver(view)
3324

34-
override func loadView() {
35-
super.loadView()
25+
guard let picker = view as? EmojiPicker else {
26+
fatalError("View should be an instance of EmojiPicker!")
27+
}
3628

37-
emojiPicker = EmojiPicker(frame: view.frame)
38-
emojiPicker.translatesAutoresizingMaskIntoConstraints = false
29+
title = localized("emojipicker.title")
3930

40-
view.addSubview(emojiPicker)
31+
picker.emojiPicked = { [unowned self] emoji in
32+
self.emojiPicked?(emoji)
4133

42-
view.addConstraints(
43-
NSLayoutConstraint.constraints(
44-
withVisualFormat: "|-0-[view]-0-|", options: [], metrics: nil, views: ["view": emojiPicker]
45-
)
46-
)
47-
view.addConstraints(
48-
NSLayoutConstraint.constraints(
49-
withVisualFormat: "V:|-0-[view]-0-|", options: [], metrics: nil, views: ["view": emojiPicker]
50-
)
51-
)
34+
if self.navigationController?.topViewController == self {
35+
self.navigationController?.popViewController(animated: true)
36+
} else {
37+
self.dismiss(animated: true)
38+
}
39+
}
5240

53-
title = localized("emojipicker.title")
54-
}
41+
picker.customEmojis = customEmojis
5542

56-
override func viewWillAppear(_ animated: Bool) {
5743
let center = NotificationCenter.default
5844
center.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
5945
center.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
6046

61-
// remove title from back button
62-
6347
if self.navigationController?.topViewController == self {
6448
navigationController?.navigationBar.topItem?.title = ""
6549
}
6650
}
6751

6852
override func viewWillDisappear(_ animated: Bool) {
69-
let center = NotificationCenter.default
70-
center.removeObserver(self)
71-
emojiPicker.endEditing(true)
53+
super.viewWillDisappear(animated)
54+
55+
view.endEditing(true)
56+
}
57+
58+
deinit {
59+
NotificationCenter.default.removeObserver(self)
7260
}
7361

7462
override func keyboardWillShow(_ notification: Notification) {

Rocket.Chat/External/RCEmojiKit/Views/Reaction/ReactorListView.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ final class ReactorListView: UIView {
5454
}
5555
}
5656

57-
var isPopover = false
5857
var selectedReactor: (String, CGRect) -> Void = { _, _ in }
5958
var configureCell: (ReactorCell) -> Void = { _ in }
6059

Rocket.Chat/External/RCEmojiKit/Views/Reaction/ReactorListViewController.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ final class ReactorListViewController: UIViewController, Closeable {
2929

3030
var reactorListView: ReactorListView! {
3131
didSet {
32-
reactorListView.isPopover = presentationController?.presentationStyle == .popover
3332
reactorListView.model = model
3433
}
3534
}

Rocket.Chat/External/RCEmojiKit/pl.lproj/RCEmojiKit.strings

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
Copyright © 2017 Rocket.Chat. All rights reserved.
77
*/
88

9-
"controller.title" = "Wybierz reakcję";
9+
"emojipicker.title" = "Wybierz reakcję";
1010
"searchbar.placeholder" = "Wyszukaj emoji";
1111

1212
"categories.recent" = "CZĘSTO UŻYWANE";

0 commit comments

Comments
 (0)