Update existing bar button items using the new convenience methods

This commit is contained in:
Elaine 2024-03-25 12:20:19 -06:00 committed by GitHub
parent 23b961560c
commit f7f9d1ef82
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
66 changed files with 348 additions and 719 deletions

View File

@ -196,10 +196,7 @@ public class SearchResultsBar: UIView {
showMoreRecentButton.imageInsets = UIEdgeInsets(top: 2, left: leftInteriorChevronMargin, bottom: 2, right: leftExteriorChevronMargin)
showMoreRecentButton.tintColor = Theme.accentBlueColor
let spacer1 = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let spacer2 = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
toolbar.items = [showLessRecentButton, showMoreRecentButton, spacer1, labelItem, spacer2]
toolbar.items = [showLessRecentButton, showMoreRecentButton, .flexibleSpace(), labelItem, .flexibleSpace()]
self.autoresizingMask = .flexibleHeight
self.translatesAutoresizingMaskIntoConstraints = false

View File

@ -144,19 +144,11 @@ class UsernameLinkQRCodeColorPickerViewController: OWSTableViewController2 {
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel),
accessibilityIdentifier: "cancel"
)
navigationItem.leftBarButtonItem = .cancelButton(dismissingFrom: self)
navigationItem.rightBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .done,
target: self,
action: #selector(didTapDone),
accessibilityIdentifier: "done"
)
navigationItem.rightBarButtonItem = .doneButton { [weak self] in
self?.didTapDone()
}
navigationItem.title = OWSLocalizedString(
"USERNAME_LINK_QR_CODE_COLOR_PICKER_VIEW_TITLE_COLOR",
@ -212,12 +204,6 @@ class UsernameLinkQRCodeColorPickerViewController: OWSTableViewController2 {
// MARK: - Events
@objc
private func didTapCancel() {
dismiss(animated: true)
}
@objc
private func didTapDone() {
if startingColor != currentColor {
colorPickerDelegate?.didFinalizeSelectedColor(color: currentColor)

View File

@ -92,12 +92,7 @@ class UsernameLinkQRCodeContentController: OWSViewController, OWSNavigationChild
addChild(presentQRCodeViewController)
addChild(scanQRCodeViewController)
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .done,
target: self,
action: #selector(didTapDone),
accessibilityIdentifier: "done"
)
navigationItem.leftBarButtonItem = .doneButton(dismissingFrom: self)
contentSegmentedControl.selectedSegmentIndex = 0
navigationItem.titleView = contentSegmentedControl
@ -130,9 +125,4 @@ class UsernameLinkQRCodeContentController: OWSViewController, OWSNavigationChild
setActive(viewController: scanQRCodeViewController)
}
}
@objc
private func didTapDone() {
dismiss(animated: true)
}
}

View File

@ -12,16 +12,7 @@ class UsernameLinkScanQRCodeSheet: UsernameLinkScanQRCodeViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.title = CommonStrings.scanQRCodeTitle
navigationItem.leftBarButtonItem = .init(
barButtonSystemItem: .done,
target: self,
action: #selector(didTapDone)
)
}
@objc
private func didTapDone() {
dismiss(animated: true)
navigationItem.leftBarButtonItem = .doneButton(dismissingFrom: self)
}
}

View File

@ -196,12 +196,9 @@ class UsernameSelectionViewController: OWSViewController, OWSNavigationChildCont
// MARK: Views
/// Navbar button for finishing this view.
private lazy var doneBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .done,
target: self,
action: #selector(didTapDone),
accessibilityIdentifier: "done_button"
)
private lazy var doneBarButtonItem: UIBarButtonItem = .doneButton { [weak self] in
self?.didTapDone()
}
private lazy var wrapperScrollView = UIScrollView()
@ -300,11 +297,9 @@ class UsernameSelectionViewController: OWSViewController, OWSNavigationChildCont
comment: "The title for the username selection view."
)
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel),
accessibilityIdentifier: "cancel_button"
navigationItem.leftBarButtonItem = .cancelButton(
dismissingFrom: self,
hasUnsavedChanges: { [weak self] in self?.hasUnsavedEdits }
)
navigationItem.rightBarButtonItem = doneBarButtonItem
@ -606,24 +601,9 @@ private extension UsernameSelectionViewController {
// MARK: - Nav bar events
private extension UsernameSelectionViewController {
/// Called when the user cancels editing. Dismisses the view, discarding
/// unsaved changes.
@objc
private func didTapCancel() {
guard hasUnsavedEdits else {
dismiss(animated: true)
return
}
OWSActionSheets.showPendingChangesActionSheet(discardAction: { [weak self] in
guard let self else { return }
self.dismiss(animated: true)
})
}
/// Called when the user taps "Done". Attempts to finalize the new chosen
/// username.
@objc
private func didTapDone() {
AssertIsOnMainThread()

View File

@ -34,7 +34,7 @@ class DeleteAccountConfirmationViewController: OWSTableViewController2 {
super.viewDidLoad()
navigationItem.leftBarButtonItem = .init(barButtonSystemItem: .cancel, target: self, action: #selector(didTapCancel))
navigationItem.leftBarButtonItem = .cancelButton(dismissingFrom: self)
navigationItem.rightBarButtonItem = .init(title: CommonStrings.deleteButton, style: .done, target: self, action: #selector(didTapDelete))
navigationItem.rightBarButtonItem?.setTitleTextAttributes([.foregroundColor: UIColor.ows_accentRed], for: .normal)
@ -361,11 +361,6 @@ class DeleteAccountConfirmationViewController: OWSTableViewController2 {
return possibleNumbers.contains(localNumber)
}
@objc
private func didTapCancel() {
dismiss(animated: true)
}
}
extension DeleteAccountConfirmationViewController: CountryCodeViewControllerDelegate {

View File

@ -23,7 +23,7 @@ class AppSettingsViewController: OWSTableViewController2 {
}
title = OWSLocalizedString("SETTINGS_NAV_BAR_TITLE", comment: "Title for settings activity")
navigationItem.leftBarButtonItem = .init(barButtonSystemItem: .done, target: self, action: #selector(didTapDone))
navigationItem.leftBarButtonItem = .doneButton(dismissingFrom: self)
defaultSeparatorInsetLeading = Self.cellHInnerMargin + 24 + OWSTableItem.iconSpacing
@ -63,11 +63,6 @@ class AppSettingsViewController: OWSTableViewController2 {
)
}
@objc
private func didTapDone() {
dismiss(animated: true)
}
@objc
private func localProfileDidChange() {
AssertIsOnMainThread()

View File

@ -58,11 +58,7 @@ private class AppIconLearnMoreTableViewController: OWSTableViewController2 {
super.viewDidLoad()
updateTableContents()
navigationItem.leftBarButtonItem = .init(
barButtonSystemItem: .done,
target: self, action: #selector(didTapDone),
accessibilityIdentifier: "AppIconLearnMoreTableViewController.done"
)
navigationItem.leftBarButtonItem = .doneButton(dismissingFrom: self)
}
override func themeDidChange() {
@ -129,11 +125,6 @@ private class AppIconLearnMoreTableViewController: OWSTableViewController2 {
imageView.autoPinEdgesToSuperviewEdges(with: insets)
return cell
}
@objc
private func didTapDone() {
dismiss(animated: true)
}
}
// MARK: - AppIconSettingsTableViewControllerDelegate

View File

@ -148,16 +148,15 @@ final class ContactSupportViewController: OWSTableViewController2 {
}
func setupNavigationBar() {
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel)
)
navigationItem.rightBarButtonItem = UIBarButtonItem(
navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
self?.didTapCancel()
}
navigationItem.rightBarButtonItem = .button(
title: CommonStrings.nextButton,
style: .done,
target: self,
action: #selector(didTapNext)
action: { [weak self] in
self?.didTapNext()
}
)
navigationItem.rightBarButtonItem?.isEnabled = false
}
@ -231,7 +230,6 @@ final class ContactSupportViewController: OWSTableViewController2 {
// MARK: - Actions
@objc
private func didTapCancel() {
currentEmailComposeOperation?.cancel()
navigationController?.presentingViewController?.dismiss(animated: true, completion: nil)
@ -239,7 +237,6 @@ final class ContactSupportViewController: OWSTableViewController2 {
var currentEmailComposeOperation: ComposeSupportEmailOperation?
@objc
private func didTapNext() {
var emailRequest = SupportEmailModel()
emailRequest.userDescription = descriptionField.text

View File

@ -41,7 +41,9 @@ class CurrencyPickerViewController<DataSourceType: CurrencyPickerDataSource>: OW
title = OWSLocalizedString("CURRENCY_PICKER_VIEW_TITLE",
comment: "Title for the 'currency picker' view in the app settings.")
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(didTapCancel))
navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
self?.dismissPicker()
}
searchBar.placeholder = CommonStrings.searchBarPlaceholder
searchBar.delegate = self
@ -197,11 +199,6 @@ class CurrencyPickerViewController<DataSourceType: CurrencyPickerDataSource>: OW
}
}
@objc
private func didTapCancel() {
dismissPicker()
}
private func didSelectCurrency(_ currencyCode: String) {
completion(currencyCode)
dismissPicker()

View File

@ -129,11 +129,7 @@ public class BadgeGiftingChooseBadgeViewController: OWSTableViewController2 {
let isPresentedStandalone = navigationController?.viewControllers.first == self
if isPresentedStandalone {
navigationItem.leftBarButtonItem = .init(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel)
)
navigationItem.leftBarButtonItem = .cancelButton(dismissingFrom: self)
}
loadDataIfNecessary()
@ -147,13 +143,6 @@ public class BadgeGiftingChooseBadgeViewController: OWSTableViewController2 {
updateBottomFooter()
}
// MARK: - Events
@objc
private func didTapCancel() {
dismiss(animated: true)
}
// MARK: - Table contents
private func updateTableContents() {

View File

@ -48,12 +48,9 @@ class NotificationSettingsSoundViewController: OWSTableViewController2 {
}
private func updateNavigation() {
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel),
accessibilityIdentifier: "cancel_button"
)
navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
self?.didTapCancel()
}
if hasUnsavedChanges {
navigationItem.rightBarButtonItem = UIBarButtonItem(
@ -144,7 +141,6 @@ class NotificationSettingsSoundViewController: OWSTableViewController2 {
completion?()
}
@objc
private func didTapCancel() {
guard hasUnsavedChanges else {
stopPlayingAndDismiss()

View File

@ -55,18 +55,15 @@ class ProxySettingsViewController: OWSTableViewController2 {
private func updateNavigationBar() {
if navigationController?.viewControllers.count == 1 {
navigationItem.leftBarButtonItem = .init(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel)
navigationItem.leftBarButtonItem = .cancelButton(
dismissingFrom: self,
hasUnsavedChanges: { [weak self] in self?.hasPendingChanges }
)
}
navigationItem.rightBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .save,
target: self,
action: #selector(didTapSave)
)
navigationItem.rightBarButtonItem = .systemItem(.save) { [weak self] in
self?.didTapSave()
}
navigationItem.rightBarButtonItem?.isEnabled = hasPendingChanges
}
@ -191,7 +188,6 @@ class ProxySettingsViewController: OWSTableViewController2 {
return true
}
@objc
private func didTapSave() {
hostTextField.resignFirstResponder()
@ -271,17 +267,6 @@ class ProxySettingsViewController: OWSTableViewController2 {
}
}
@objc
private func didTapCancel() {
if hasPendingChanges {
OWSActionSheets.showPendingChangesActionSheet { [weak self] in
self?.dismiss(animated: true)
}
} else {
dismiss(animated: true)
}
}
var shouldCancelNavigationBack: Bool {
if hasPendingChanges {
OWSActionSheets.showPendingChangesActionSheet { [weak self] in

View File

@ -89,11 +89,9 @@ class BadgeConfigurationViewController: OWSTableViewController2, BadgeCollection
private func updateNavigation() {
if navigationController?.viewControllers.count == 1 {
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel),
accessibilityIdentifier: "cancel_button")
navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
self?.didTapCancel()
}
}
if hasUnsavedChanges, showDismissalActivity {
@ -103,18 +101,18 @@ class BadgeConfigurationViewController: OWSTableViewController2, BadgeCollection
spinner.startAnimating()
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: spinner)
} else if hasUnsavedChanges, !showDismissalActivity {
navigationItem.rightBarButtonItem = UIBarButtonItem(
navigationItem.rightBarButtonItem = .button(
title: CommonStrings.setButton,
style: .done,
target: self,
action: #selector(didTapDone),
accessibilityIdentifier: "set_button")
action: { [weak self] in
self?.didTapDone()
}
)
} else {
navigationItem.rightBarButtonItem = nil
}
}
@objc
private func didTapCancel() {
let requestDismissal: () -> Void = { [weak self] in
guard let self = self else { return }
@ -128,7 +126,6 @@ class BadgeConfigurationViewController: OWSTableViewController2, BadgeCollection
}
}
@objc
private func didTapDone() {
if displayBadgeOnProfile, let selectedPrimaryBadge = selectedPrimaryBadge {
badgeConfigDelegate?.badgeConfiguration(self, didCompleteWithBadgeSetting: .display(featuredBadge: selectedPrimaryBadge))

View File

@ -101,22 +101,17 @@ class ProfileBioViewController: OWSTableViewController2 {
title = OWSLocalizedString("PROFILE_BIO_VIEW_TITLE", comment: "Title for the profile bio view.")
}
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel),
accessibilityIdentifier: "cancel_button"
navigationItem.leftBarButtonItem = .cancelButton(
dismissingFrom: self,
hasUnsavedChanges: { [weak self] in self?.hasUnsavedChanges }
)
cancelButton.isHiddenInStackView = normalizedProfileBio?.isEmpty != false && normalizedProfileBioEmoji?.isEmpty != false
if hasUnsavedChanges {
navigationItem.rightBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .done,
target: self,
action: #selector(didTapDone),
accessibilityIdentifier: "done_button"
)
navigationItem.rightBarButtonItem = .doneButton { [weak self] in
self?.didTapDone()
}
} else {
navigationItem.rightBarButtonItem = nil
}
@ -287,19 +282,6 @@ class ProfileBioViewController: OWSTableViewController2 {
]
}
@objc
private func didTapCancel() {
guard hasUnsavedChanges else {
dismiss(animated: true)
return
}
OWSActionSheets.showPendingChangesActionSheet(discardAction: { [weak self] in
self?.dismiss(animated: true)
})
}
@objc
private func didTapDone() {
profileDelegate?.profileBioViewDidComplete(bio: normalizedProfileBio, bioEmoji: normalizedProfileBioEmoji)

View File

@ -687,19 +687,14 @@ class ProfileSettingsViewController: OWSTableViewController2 {
private func updateNavigationItem() {
if hasUnsavedChanges {
// If we have a unsaved changes, right item should be a "save" button.
let saveButton = UIBarButtonItem(
barButtonSystemItem: .save,
target: self,
action: #selector(updateProfile),
accessibilityIdentifier: "save_button"
)
navigationItem.rightBarButtonItem = saveButton
navigationItem.rightBarButtonItem = .systemItem(.save) { [weak self] in
self?.updateProfile()
}
} else {
navigationItem.rightBarButtonItem = nil
}
}
@objc
private func updateProfile() {
// Copy this on the main thread before the asynchronous update.

View File

@ -47,15 +47,6 @@ class AvatarEditViewController: OWSTableViewController2 {
updateFooterViewLayout(forceUpdate: true)
}
@objc
private func didTapCancel() {
guard model != originalModel else { return dismiss(animated: true) }
OWSActionSheets.showPendingChangesActionSheet(discardAction: { [weak self] in
self?.dismiss(animated: true)
})
}
@objc
private func didTapDone() {
defer { dismiss(animated: true) }
@ -67,12 +58,19 @@ class AvatarEditViewController: OWSTableViewController2 {
}
private func updateNavigation() {
navigationItem.leftBarButtonItem = .init(barButtonSystemItem: .cancel, target: self, action: #selector(didTapCancel))
navigationItem.leftBarButtonItem = .cancelButton(
dismissingFrom: self,
hasUnsavedChanges: { [weak self] in
self?.model != self?.originalModel
}
)
if case .text(let text) = model.type, text.nilIfEmpty == nil {
navigationItem.rightBarButtonItem = nil
} else if model != originalModel {
navigationItem.rightBarButtonItem = .init(barButtonSystemItem: .done, target: self, action: #selector(didTapDone))
navigationItem.rightBarButtonItem = .doneButton { [weak self] in
self?.didTapDone()
}
} else {
navigationItem.rightBarButtonItem = nil
}

View File

@ -80,15 +80,6 @@ class AvatarSettingsViewController: OWSTableViewController2 {
updateTableContents()
}
@objc
private func didTapCancel() {
guard state.isNew else { return dismiss(animated: true) }
OWSActionSheets.showPendingChangesActionSheet(discardAction: { [weak self] in
self?.dismiss(animated: true)
})
}
@objc
private func didTapDone() {
defer { dismiss(animated: true) }
@ -197,15 +188,18 @@ class AvatarSettingsViewController: OWSTableViewController2 {
}
private func updateNavigation() {
navigationItem.leftBarButtonItem = .init(barButtonSystemItem: .cancel, target: self, action: #selector(didTapCancel))
navigationItem.leftBarButtonItem = .cancelButton(
dismissingFrom: self,
hasUnsavedChanges: { [weak self] in self?.state.isNew }
)
if state.isNew {
navigationItem.rightBarButtonItem = UIBarButtonItem(
navigationItem.rightBarButtonItem = .button(
title: CommonStrings.setButton,
style: .done,
target: self,
action: #selector(didTapDone),
accessibilityIdentifier: "set_button"
action: { [weak self] in
self?.didTapDone()
}
)
} else {
navigationItem.rightBarButtonItem = nil

View File

@ -423,20 +423,24 @@ extension ConversationViewController {
extension ConversationViewController {
var cancelSelectionBarButtonItem: UIBarButtonItem {
UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(didTapCancelSelection))
.cancelButton { [weak self] in
self?.uiMode = .normal
}
}
var deleteAllBarButtonItem: UIBarButtonItem {
let title = OWSLocalizedString("CONVERSATION_VIEW_DELETE_ALL_MESSAGES", comment: "button text to delete all items in the current conversation")
return UIBarButtonItem(title: title, style: .plain, target: self, action: #selector(didTapDeleteAll))
return .button(
title: OWSLocalizedString(
"CONVERSATION_VIEW_DELETE_ALL_MESSAGES",
comment: "button text to delete all items in the current conversation"
),
style: .plain,
action: { [weak self] in
self?.didTapDeleteAll()
}
)
}
@objc
func didTapCancelSelection() {
uiMode = .normal
}
@objc
func didTapDeleteAll() {
let thread = self.thread
let alert = ActionSheetController(title: nil, message: OWSLocalizedString("DELETE_ALL_MESSAGES_IN_CONVERSATION_ALERT_BODY", comment: "action sheet body"))

View File

@ -39,7 +39,7 @@ class EmojiPickerSectionToolbar: BlurredToolbarContainer {
toolbar.items = Array(
buttons
.map { [UIBarButtonItem(customView: $0)] }
.joined(separator: [UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)])
.joined(separator: [.flexibleSpace()])
)
setSelectedSection(0)

View File

@ -25,11 +25,20 @@ public class EmojiReactionPickerConfigViewController: UIViewController {
title = OWSLocalizedString("CONFIGURE_REACTIONS", comment: "Configure reactions title text")
view.backgroundColor = Theme.isDarkThemeEnabled ? Theme.actionSheetBackgroundColor : UIColor.color(rgbHex: 0xF0F0F0)
let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTapped(sender:)))
navigationItem.setRightBarButton(doneButton, animated: false)
navigationItem.rightBarButtonItem = .doneButton { [weak self] in
self?.doneButtonTapped()
}
let resetButton = UIBarButtonItem(title: OWSLocalizedString("RESET", comment: "Configure reactions reset button text"), style: .plain, target: self, action: #selector(resetButtonTapped(sender:)))
navigationItem.setLeftBarButton(resetButton, animated: false)
navigationItem.leftBarButtonItem = .button(
title: OWSLocalizedString(
"RESET",
comment: "Configure reactions reset button text"
),
style: .plain,
action: { [weak self] in
self?.resetButtonTapped()
}
)
// Reaction picker
reactionPicker.delegate = self
@ -42,8 +51,7 @@ public class EmojiReactionPickerConfigViewController: UIViewController {
instructionLabel.autoPinEdge(.top, to: .bottom, of: reactionPicker, withOffset: 30)
}
@objc
private func resetButtonTapped(sender: UIButton) {
private func resetButtonTapped() {
let emojiSet: [EmojiWithSkinTones] = ReactionManager.defaultEmojiSet.map { EmojiWithSkinTones(rawValue: $0)! }
for (index, emoji) in reactionPicker.currentEmojiSet().enumerated() {
@ -53,8 +61,7 @@ public class EmojiReactionPickerConfigViewController: UIViewController {
}
}
@objc
private func doneButtonTapped(sender: UIButton) {
private func doneButtonTapped() {
let currentEmojiSet = reactionPicker.currentEmojiSet()
SDSDatabaseStorage.shared.write { transaction in
ReactionManager.setCustomEmojiSet(currentEmojiSet, transaction: transaction)

View File

@ -42,12 +42,7 @@ class BankTransferMandateViewController: OWSTableViewController2 {
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel),
accessibilityIdentifier: "cancel_button"
)
navigationItem.leftBarButtonItem = .cancelButton(dismissingFrom: self)
updateTableContents()
updateBottomFooter()
@ -258,11 +253,6 @@ class BankTransferMandateViewController: OWSTableViewController2 {
// MARK: Actions
@objc
private func didTapCancel() {
dismiss(animated: true)
}
private func loadMandate() async {
let request = OWSRequestFactory.bankMandateRequest(bankTransferType: self.bankTransferType)
do {

View File

@ -81,11 +81,7 @@ class DonateViewController: OWSViewController, OWSNavigationChildController {
let isPresentedStandalone = navigationController?.viewControllers.first == self
if isPresentedStandalone {
navigationItem.leftBarButtonItem = .init(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel)
)
navigationItem.leftBarButtonItem = .cancelButton(dismissingFrom: self)
}
OWSTableViewController2.removeBackButtonText(viewController: self)
@ -121,11 +117,6 @@ class DonateViewController: OWSViewController, OWSNavigationChildController {
// MARK: - Events
@objc
private func didTapCancel() {
dismiss(animated: true)
}
@objc
private func didDonateModeChange() {
let rawValue = donateModePickerView.selectedSegmentIndex

View File

@ -186,9 +186,9 @@ class GifPickerViewController: OWSViewController, UISearchBarDelegate, UICollect
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel,
target: self,
action: #selector(didPressCancel))
self.navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
self?.delegate?.gifPickerDidCancel()
}
self.navigationItem.title = OWSLocalizedString("GIF_PICKER_VIEW_TITLE",
comment: "Title for the 'GIF picker' dialog.")
@ -542,13 +542,6 @@ class GifPickerViewController: OWSViewController, UISearchBarDelegate, UICollect
cell.isCellVisible = false
}
// MARK: - Event Handlers
@objc
private func didPressCancel(sender: UIButton) {
delegate?.gifPickerDidCancel()
}
// MARK: - UISearchBarDelegate
public func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

View File

@ -216,9 +216,8 @@ class CallsListViewController: OWSViewController, HomeTabViewController, CallSer
guard let self else { return }
// See ChatListViewController.showToolbar for why this is async
DispatchQueue.main.async {
let spacer = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
self.multiselectToolbar?.setItems(
[spacer, self.toolbarDeleteButton],
[.flexibleSpace(), self.toolbarDeleteButton],
animated: false
)
self.updateMultiselectToolbarButtons()
@ -279,16 +278,11 @@ class CallsListViewController: OWSViewController, HomeTabViewController, CallSer
// MARK: Cancel multiselect button
private func cancelMultiselectButton() -> UIBarButtonItem {
let barButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(cancelMultiselect),
accessibilityIdentifier: CommonStrings.cancelButton
)
return barButtonItem
.cancelButton { [weak self] in
self?.cancelMultiselect()
}
}
@objc
private func cancelMultiselect() {
tableView.setEditing(false, animated: true)
updateBarButtonItems()

View File

@ -25,12 +25,9 @@ extension ChatListViewController {
searchBar.delegate?.searchBarCancelButtonClicked?(searchBar)
viewState.multiSelectState.title = title
if chatListMode == .inbox {
let doneButton = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(done),
accessibilityIdentifier: CommonStrings.cancelButton
)
let doneButton: UIBarButtonItem = .cancelButton { [weak self] in
self?.done()
}
navigationItem.setLeftBarButton(doneButton, animated: true)
navigationItem.setRightBarButtonItems(nil, animated: true)
} else {
@ -120,7 +117,6 @@ extension ChatListViewController {
// MARK: private helper
@objc
private func done() {
leaveMultiselectMode()
updateBarButtonItems()
@ -163,11 +159,10 @@ extension ChatListViewController {
let deleteBtn = UIBarButtonItem(title: CommonStrings.deleteButton, style: .plain, target: self, action: #selector(performDelete))
deleteBtn.isEnabled = hasSelectedEntries
let spacer = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
var entries: [UIBarButtonItem] = []
for button in [archiveBtn, readButton, deleteBtn] {
if !entries.isEmpty {
entries.append(spacer)
entries.append(.flexibleSpace())
}
entries.append(button)
}

View File

@ -28,10 +28,9 @@ public class PrivateStoryAddRecipientsSettingsViewController: BaseMemberViewCont
}
private func updateBarButtons() {
navigationItem.rightBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .save,
target: self,
action: #selector(updatePressed))
navigationItem.rightBarButtonItem = .systemItem(.save) { [weak self] in
self?.updatePressed()
}
navigationItem.rightBarButtonItem?.isEnabled = hasUnsavedChanges
title = OWSLocalizedString(
@ -42,7 +41,6 @@ public class PrivateStoryAddRecipientsSettingsViewController: BaseMemberViewCont
// MARK: - Actions
@objc
private func updatePressed() {
AssertIsOnMainThread()

View File

@ -65,17 +65,13 @@ public class PrivateStoryNameSettingsViewController: OWSTableViewController2 {
}
private func updateNavigationBar() {
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel)
)
navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
self?.didTapCancel()
}
navigationItem.rightBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .done,
target: self,
action: #selector(didTapDone)
)
navigationItem.rightBarButtonItem = .doneButton { [weak self] in
self?.didTapDone()
}
navigationItem.rightBarButtonItem?.isEnabled = hasPendingChanges
}
@ -103,7 +99,6 @@ public class PrivateStoryNameSettingsViewController: OWSTableViewController2 {
// MARK: - Actions
@objc
private func didTapCancel() {
AssertIsOnMainThread()
@ -116,7 +111,6 @@ public class PrivateStoryNameSettingsViewController: OWSTableViewController2 {
}
}
@objc
private func didTapDone() {
AssertIsOnMainThread()

View File

@ -23,11 +23,9 @@ class PrivateStorySettingsViewController: OWSTableViewController2 {
private func updateBarButtons() {
title = thread.name
navigationItem.rightBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .edit,
target: self,
action: #selector(editPressed)
)
navigationItem.rightBarButtonItem = .systemItem(.edit) { [weak self] in
self?.editPressed()
}
}
override func viewDidLoad() {
@ -301,7 +299,6 @@ class PrivateStorySettingsViewController: OWSTableViewController2 {
presentActionSheet(actionSheet)
}
@objc
private func editPressed() {
let vc = PrivateStoryNameSettingsViewController(thread: thread) { [weak self] in
self?.title = self?.thread.name

View File

@ -15,7 +15,7 @@ class StoryPrivacySettingsViewController: OWSTableViewController2 {
if navigationController?.viewControllers.count == 1 {
title = OWSLocalizedString("STORY_PRIVACY_TITLE", comment: "Title for the story privacy settings view")
navigationItem.leftBarButtonItem = .init(barButtonSystemItem: .done, target: self, action: #selector(didTapDone))
navigationItem.leftBarButtonItem = .doneButton(dismissingFrom: self)
} else {
title = OWSLocalizedString(
"STORY_SETTINGS_TITLE",
@ -36,11 +36,6 @@ class StoryPrivacySettingsViewController: OWSTableViewController2 {
updateTableContents()
}
@objc
private func didTapDone() {
dismiss(animated: true)
}
@objc
private func storiesEnabledStateDidChange() {
updateTableContents()

View File

@ -203,13 +203,10 @@ public class LongTextViewController: OWSViewController {
target: self,
action: #selector(shareButtonPressed)
),
UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
UIBarButtonItem(
image: Theme.iconImage(.buttonForward),
style: .plain,
target: self,
action: #selector(forwardButtonPressed)
)
.flexibleSpace(),
.button(icon: .buttonForward, style: .plain) { [weak self] in
self?.forwardButtonPressed()
},
]
loadContent()
@ -248,7 +245,6 @@ public class LongTextViewController: OWSViewController {
AttachmentSharing.showShareUI(for: shareText, sender: sender)
}
@objc
private func forwardButtonPressed() {
// Only forward text.
let selectionType: CVSelectionType = (itemViewModel.componentState.hasPrimaryAndSecondaryContentForSelection

View File

@ -191,11 +191,9 @@ public class MediaGalleryAccessoriesHelper {
return
}
if isInBatchSelectMode {
viewController.navigationItem.rightBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didCancelSelect)
)
viewController.navigationItem.rightBarButtonItem = .cancelButton { [weak self] in
self?.didCancelSelect()
}
} else {
viewController.navigationItem.rightBarButtonItem = nil // TODO: Search
}
@ -212,8 +210,7 @@ public class MediaGalleryAccessoriesHelper {
isInBatchSelectMode = true
}
@objc
private func didCancelSelect(_ sender: Any) {
private func didCancelSelect() {
endSelectMode()
}
@ -431,13 +428,12 @@ public class MediaGalleryAccessoriesHelper {
guard footerBarState != .hidden else { return }
let fixedSpace = { return UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) }
let flexibleSpace = { return UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) }
let footerBarItems: [UIBarButtonItem]? = {
switch footerBarState {
case .hidden:
return nil
case .selection:
return [ shareButton, flexibleSpace(), selectionInfoButton, flexibleSpace(), deleteButton ]
return [ shareButton, .flexibleSpace(), selectionInfoButton, .flexibleSpace(), deleteButton ]
case .regular:
let firstItem: UIBarButtonItem
if isGridViewAllowed {
@ -450,9 +446,9 @@ public class MediaGalleryAccessoriesHelper {
}
return [
firstItem,
flexibleSpace(),
.flexibleSpace(),
currentFileTypeSupportsFiltering ? filterButton : fixedSpace(),
flexibleSpace(),
.flexibleSpace(),
selectButton
]
}
@ -530,11 +526,12 @@ public class MediaGalleryAccessoriesHelper {
// MARK: - Delete
private lazy var deleteButton = UIBarButtonItem(
image: Theme.iconImage(.buttonDelete),
private lazy var deleteButton = UIBarButtonItem.button(
icon: .buttonDelete,
style: .plain,
target: self,
action: #selector(didPressDelete)
action: { [weak self] in
self?.didPressDelete()
}
)
private func updateDeleteButton() {
@ -542,8 +539,7 @@ public class MediaGalleryAccessoriesHelper {
deleteButton.isEnabled = viewController.hasSelection
}
@objc
private func didPressDelete(_ sender: Any) {
private func didPressDelete() {
Logger.debug("")
viewController?.deleteSelectedItems()
}

View File

@ -160,7 +160,7 @@ public class MessageActionsToolbar: UIToolbar {
var actionItems = [MessageActionsToolbarButton]()
for action in messagesActions {
if !newItems.isEmpty {
newItems.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
newItems.append(.flexibleSpace())
}
let actionItem = MessageActionsToolbarButton(actionsToolbar: self, messageAction: action)
@ -172,8 +172,8 @@ public class MessageActionsToolbar: UIToolbar {
// If we only have a single button, center it.
if newItems.count == 1 {
newItems.insert(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil), at: 0)
newItems.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
newItems.insert(.flexibleSpace(), at: 0)
newItems.append(.flexibleSpace())
}
items = newItems
@ -199,9 +199,9 @@ public class MessageActionsToolbar: UIToolbar {
var newItems = [UIBarButtonItem]()
newItems.append(deleteItem)
newItems.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
newItems.append(.flexibleSpace())
newItems.append(labelItem)
newItems.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
newItems.append(.flexibleSpace())
newItems.append(forwardItem)
items = newItems

View File

@ -379,20 +379,17 @@ public class PinSetupViewController: OWSViewController, OWSNavigationChildContro
moreButton.isHidden = isNavigationBarVisible || !showDisablePinButton
if isNavigationBarVisible, showDisablePinButton {
self.navigationItem.rightBarButtonItem = UIBarButtonItem(
image: Theme.iconImage(.buttonMore),
self.navigationItem.rightBarButtonItem = .button(
icon: .buttonMore,
style: .plain,
target: self,
action: #selector(didTapMoreButton(_:))
action: { [weak self] in
self?.didTapMoreButton()
}
)
}
if showCancelButton {
self.navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel)
)
self.navigationItem.leftBarButtonItem = .cancelButton(dismissingFrom: self)
}
OWSTableViewController2.removeBackButtonText(viewController: self)
@ -422,12 +419,7 @@ public class PinSetupViewController: OWSViewController, OWSNavigationChildContro
}
@objc
private func didTapCancel() {
dismiss(animated: true)
}
@objc
private func didTapMoreButton(_ sender: UIButton) {
private func didTapMoreButton() {
let actionSheet = ActionSheetController()
actionSheet.addAction(OWSActionSheets.cancelAction)

View File

@ -52,14 +52,10 @@ public class SendPaymentMemoViewController: OWSViewController {
private func createContents() {
navigationItem.title = OWSLocalizedString("PAYMENTS_NEW_PAYMENT_ADD_MEMO",
comment: "Label for the 'add memo' ui in the 'send payment' UI.")
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancelMemo),
accessibilityIdentifier: "memo.cancel")
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done,
target: self,
action: #selector(didTapDoneMemo),
accessibilityIdentifier: "memo.done")
navigationItem.leftBarButtonItem = .cancelButton(poppingFrom: navigationController)
navigationItem.rightBarButtonItem = .doneButton { [weak self] in
self?.didTapDoneMemo()
}
rootStack.axis = .vertical
rootStack.alignment = .fill
@ -149,12 +145,6 @@ public class SendPaymentMemoViewController: OWSViewController {
// MARK: - Events
@objc
private func didTapCancelMemo() {
navigationController?.popViewController(animated: true)
}
@objc
private func didTapDoneMemo() {
let memoMessage = memoTextField.text?.ows_stripped()
delegate?.didChangeMemo(memoMessage: memoMessage)

View File

@ -474,10 +474,7 @@ public class SendPaymentViewController: OWSViewController {
view.backgroundColor = tableBackgroundColor
navigationItem.title = nil
if mode.isModalRootView {
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done,
target: self,
action: #selector(didTapDismiss),
accessibilityIdentifier: "dismiss")
navigationItem.leftBarButtonItem = .doneButton(dismissingFrom: self)
navigationItem.rightBarButtonItem = nil
} else {
navigationItem.leftBarButtonItem = nil
@ -858,11 +855,6 @@ public class SendPaymentViewController: OWSViewController {
// MARK: - Events
@objc
private func didTapDismiss() {
dismiss(animated: true, completion: nil)
}
@objc
private func didTapAddMemo() {
let view = SendPaymentMemoViewController(memoMessage: self.memoMessage)

View File

@ -84,7 +84,10 @@ class ImagePickerGridController: UICollectionViewController, PhotoLibraryDelegat
navigationItem.titleView = titleView
let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(didPressCancel))
let cancelButton: UIBarButtonItem = .cancelButton { [weak self] in
guard let self else { return }
self.delegate?.imagePickerDidCancel(self)
}
cancelButton.tintColor = Theme.darkThemePrimaryColor
navigationItem.leftBarButtonItem = cancelButton
@ -315,11 +318,6 @@ class ImagePickerGridController: UICollectionViewController, PhotoLibraryDelegat
// MARK: - Actions
@objc
private func didPressCancel() {
self.delegate?.imagePickerDidCancel(self)
}
@objc
private func didTapDoneButton() {
delegate?.imagePickerDidComplete(self)

View File

@ -29,17 +29,7 @@ class ComposeViewController: RecipientPickerContainerViewController {
recipientPicker.view.autoPinEdge(toSuperviewEdge: .trailing)
recipientPicker.view.autoPinEdge(toSuperviewEdge: .bottom)
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(dismissPressed))
}
@objc
private func dismissPressed() {
dismiss(animated: true)
}
@objc
private func newGroupPressed() {
showNewGroupUI()
navigationItem.leftBarButtonItem = .cancelButton(dismissingFrom: self)
}
/// Presents the conversation for the given address and dismisses this

View File

@ -43,11 +43,9 @@ class RegistrationChangeNumberSplashViewController: OWSViewController, OWSNaviga
}
private func createContents() {
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didPressCancel)
)
navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
self?.presenter?.exitRegistration()
}
let scrollView = UIScrollView()
view.addSubview(scrollView)
@ -143,11 +141,6 @@ class RegistrationChangeNumberSplashViewController: OWSViewController, OWSNaviga
continueButton.autoPinEdgesToSuperviewMargins()
}
@objc
private func didPressCancel() {
presenter?.exitRegistration()
}
@objc
private func didTapContinue(_ sender: UIButton) {
presenter?.continueFromSplash()

View File

@ -80,22 +80,17 @@ class RegistrationChangePhoneNumberViewController: OWSTableViewController2 {
title = OWSLocalizedString("SETTINGS_CHANGE_PHONE_NUMBER_VIEW_TITLE",
comment: "Title for the 'change phone number' views in settings.")
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didPressCancel)
)
navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
self?.presenter?.exitRegistration()
}
updateTableContents()
}
fileprivate func updateNavigationBar() {
let doneItem = UIBarButtonItem(
barButtonSystemItem: .done,
target: self,
action: #selector(didTapContinue)
)
navigationItem.rightBarButtonItem = doneItem
navigationItem.rightBarButtonItem = .doneButton { [weak self] in
self?.tryToContinue()
}
}
override func viewWillAppear(_ animated: Bool) {
@ -280,22 +275,6 @@ class RegistrationChangePhoneNumberViewController: OWSTableViewController2 {
comment: "Error indicating that the user's old and new phone numbers are identical.")
OWSActionSheets.showActionSheet(title: nil, message: message)
}
// MARK: - Events
@objc
private func didPressCancel() {
AssertIsOnMainThread()
presenter?.exitRegistration()
}
@objc
private func didTapContinue() {
AssertIsOnMainThread()
tryToContinue()
}
}
// MARK: -

View File

@ -66,7 +66,7 @@ public class ManageStickersViewController: OWSTableViewController2 {
navigationItem.title = OWSLocalizedString("STICKERS_MANAGE_VIEW_TITLE", comment: "Title for the 'manage stickers' view.")
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(didPressDismiss))
navigationItem.leftBarButtonItem = .cancelButton(dismissingFrom: self)
}
override public func viewDidLoad() {
@ -537,13 +537,6 @@ public class ManageStickersViewController: OWSTableViewController2 {
needsStateUpdate = true
}
@objc
private func didPressDismiss(sender: UIButton) {
AssertIsOnMainThread()
dismiss(animated: true)
}
}
// MARK: -

View File

@ -31,7 +31,9 @@ public class AddToGroupViewController: OWSTableViewController2 {
title = OWSLocalizedString("ADD_TO_GROUP_TITLE", comment: "Title of the 'add to group' view.")
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(didPressCloseButton))
navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
self?.didPressCloseButton()
}
defaultSeparatorInsetLeading = Self.cellHInnerMargin + CGFloat(AvatarBuilder.smallAvatarSizePoints) + ContactCellView.avatarTextHSpacing
@ -94,8 +96,7 @@ public class AddToGroupViewController: OWSTableViewController2 {
updateTableContents()
}
@objc
private func didPressCloseButton(sender: UIButton) {
private func didPressCloseButton() {
Logger.info("")
self.dismiss(animated: true)

View File

@ -66,21 +66,19 @@ class DisappearingMessagesTimerSettingsViewController: OWSTableViewController2 {
private func updateNavigation() {
if !useCustomPicker {
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel),
accessibilityIdentifier: "cancel_button"
navigationItem.leftBarButtonItem = .cancelButton(
dismissingFrom: self,
hasUnsavedChanges: { [weak self] in self?.hasUnsavedChanges }
)
}
if hasUnsavedChanges {
navigationItem.rightBarButtonItem = UIBarButtonItem(
navigationItem.rightBarButtonItem = .button(
title: CommonStrings.setButton,
style: .done,
target: self,
action: #selector(didTapDone),
accessibilityIdentifier: "set_button"
action: { [weak self] in
self?.didTapDone()
}
)
} else {
navigationItem.rightBarButtonItem = nil
@ -179,19 +177,6 @@ class DisappearingMessagesTimerSettingsViewController: OWSTableViewController2 {
return OWSDisappearingMessagesConfiguration.presetDurationsSeconds().map { $0.uint32Value }.reversed()
}
@objc
private func didTapCancel() {
guard hasUnsavedChanges else {
dismiss(animated: true)
return
}
OWSActionSheets.showPendingChangesActionSheet(discardAction: { [weak self] in
self?.dismiss(animated: true)
})
}
@objc
private func didTapDone() {
let configuration = self.configuration

View File

@ -119,38 +119,30 @@ class GroupDescriptionViewController: OWSTableViewController2 {
}
if isEditable {
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel),
accessibilityIdentifier: "cancel_button"
navigationItem.leftBarButtonItem = .cancelButton(
dismissingFrom: self,
hasUnsavedChanges: { [weak self] in self?.helper.hasUnsavedChanges }
)
} else {
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .done,
target: self,
action: #selector(didTapDone),
accessibilityIdentifier: "done_button"
)
navigationItem.leftBarButtonItem = .doneButton { [weak self] in
self?.didTapDone()
}
}
if helper.hasUnsavedChanges {
owsAssertDebug(isEditable)
if options.contains(.updateImmediately) {
navigationItem.rightBarButtonItem = UIBarButtonItem(
navigationItem.rightBarButtonItem = .button(
title: CommonStrings.setButton,
style: .done,
target: self,
action: #selector(didTapSet),
accessibilityIdentifier: "set_button"
action: { [weak self] in
self?.didTapSet()
}
)
} else {
navigationItem.rightBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .done,
target: self,
action: #selector(didTapDone),
accessibilityIdentifier: "done_button"
)
navigationItem.rightBarButtonItem = .doneButton { [weak self] in
self?.didTapDone()
}
}
} else {
navigationItem.rightBarButtonItem = nil
@ -213,26 +205,12 @@ class GroupDescriptionViewController: OWSTableViewController2 {
self.contents = contents
}
@objc
private func didTapCancel() {
guard helper.hasUnsavedChanges else {
dismiss(animated: true)
return
}
OWSActionSheets.showPendingChangesActionSheet(discardAction: { [weak self] in
self?.dismiss(animated: true)
})
}
@objc
private func didTapDone() {
helper.descriptionTextView.acceptAutocorrectSuggestion()
descriptionDelegate?.groupDescriptionViewControllerDidComplete(groupDescription: helper.groupDescriptionCurrent)
dismiss(animated: true)
}
@objc
private func didTapSet() {
guard isEditable, helper.hasUnsavedChanges else {
return owsFailDebug("Unexpectedly trying to set")

View File

@ -59,20 +59,15 @@ class GroupNameViewController: OWSTableViewController2 {
comment: "Title for the group name view."
)
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel),
accessibilityIdentifier: "cancel_button"
navigationItem.leftBarButtonItem = .cancelButton(
dismissingFrom: self,
hasUnsavedChanges: { [weak self] in self?.helper.hasUnsavedChanges }
)
if helper.hasUnsavedChanges {
navigationItem.rightBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .done,
target: self,
action: #selector(didTapDone),
accessibilityIdentifier: "done_button"
)
navigationItem.rightBarButtonItem = .doneButton { [weak self] in
self?.didTapDone()
}
} else {
navigationItem.rightBarButtonItem = nil
}
@ -116,19 +111,6 @@ class GroupNameViewController: OWSTableViewController2 {
self.contents = contents
}
@objc
private func didTapCancel() {
guard helper.hasUnsavedChanges else {
dismiss(animated: true)
return
}
OWSActionSheets.showPendingChangesActionSheet(discardAction: { [weak self] in
self?.dismiss(animated: true)
})
}
@objc
private func didTapDone() {
helper.nameTextField.acceptAutocorrectSuggestion()
nameDelegate?.groupNameViewControllerDidComplete(groupName: helper.groupNameCurrent)

View File

@ -68,20 +68,18 @@ class GroupPermissionsSettingsViewController: OWSTableViewController2 {
}
private func updateNavigation() {
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel),
accessibilityIdentifier: "cancel_button"
navigationItem.leftBarButtonItem = .cancelButton(
dismissingFrom: self,
hasUnsavedChanges: { [weak self] in self?.hasUnsavedChanges }
)
if hasUnsavedChanges {
navigationItem.rightBarButtonItem = UIBarButtonItem(
navigationItem.rightBarButtonItem = .button(
title: CommonStrings.setButton,
style: .done,
target: self,
action: #selector(didTapSet),
accessibilityIdentifier: "set_button"
action: { [weak self] in
self?.didTapSet()
}
)
} else {
navigationItem.rightBarButtonItem = nil
@ -258,19 +256,6 @@ class GroupPermissionsSettingsViewController: OWSTableViewController2 {
updateTableContents()
}
@objc
private func didTapCancel() {
guard hasUnsavedChanges else {
dismiss(animated: true)
return
}
OWSActionSheets.showPendingChangesActionSheet(discardAction: { [weak self] in
self?.dismiss(animated: true)
})
}
@objc
private func didTapSet() {
guard groupViewHelper.canEditPermissions else {
owsFailDebug("Missing edit permission.")

View File

@ -55,10 +55,9 @@ class NameCollisionResolutionViewController: OWSTableViewController2 {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .done,
target: self,
action: #selector(donePressed))
navigationItem.leftBarButtonItem = .doneButton { [weak self] in
self?.donePressed()
}
navigationItem.rightBarButtonItem = nil
}
@ -262,8 +261,7 @@ class NameCollisionResolutionViewController: OWSTableViewController2 {
// We observe contact updates and will automatically update our model in response
}
@objc
private func donePressed(_ sender: UIBarButtonItem) {
private func donePressed() {
// When the user presses done, implicitly mark the remaining collisions as resolved (if the finder supports it)
// Note: We only do this for dismissal via "Done". If the user uses interactive sheet dismissal, leave the
// collisions as-is.

View File

@ -61,11 +61,7 @@ private class AddToContactsFlowNavigationController: UINavigationController, CNC
let contactViewController = contactsViewHelper.contactViewController(for: flow)
// CNContactViewController doesn't provide a Cancel button unless in editing mode.
if !flow.editImmediately {
contactViewController.navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(cancelButtonTapped(sender:))
)
contactViewController.navigationItem.leftBarButtonItem = .cancelButton(dismissingFrom: self, completion: completion)
}
pushViewController(contactViewController, animated: false)
case is AddToExistingContactFlow:
@ -92,11 +88,6 @@ private class AddToContactsFlowNavigationController: UINavigationController, CNC
}
}
@objc
private func cancelButtonTapped(sender: Any) {
dismiss(animated: true, completion: completion)
}
// MARK: CNContactViewControllerDelegate
func contactViewController(_ viewController: CNContactViewController, didCompleteWith contact: CNContact?) {

View File

@ -112,10 +112,13 @@ class CustomColorViewController: OWSTableViewController2 {
title = OWSLocalizedString("CUSTOM_CHAT_COLOR_SETTINGS_TITLE",
comment: "Title for the custom chat color settings view.")
navigationItem.rightBarButtonItem = .init(title: CommonStrings.setButton,
style: .done,
target: self,
action: #selector(didTapSet))
navigationItem.rightBarButtonItem = .button(
title: CommonStrings.setButton,
style: .done,
action: { [weak self] in
self?.didTapSet()
}
)
createSubviews()
@ -177,20 +180,17 @@ class CustomColorViewController: OWSTableViewController2 {
}
self.navigationState = navigationState
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel),
accessibilityIdentifier: "cancel_button"
)
navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
self?.didTapCancel()
}
if hasUnsavedChanges {
navigationItem.rightBarButtonItem = UIBarButtonItem(
navigationItem.rightBarButtonItem = .button(
title: CommonStrings.setButton,
style: .done,
target: self,
action: #selector(didTapDone),
accessibilityIdentifier: "set_button"
action: { [weak self] in
self?.didTapDone()
}
)
} else {
navigationItem.rightBarButtonItem = nil
@ -471,12 +471,10 @@ class CustomColorViewController: OWSTableViewController2 {
self.navigationController?.popViewController(animated: true)
}
@objc
private func didTapSet() {
showSaveUI()
}
@objc
private func didTapCancel() {
guard hasUnsavedChanges else {
dismissWithoutSaving()
@ -488,7 +486,6 @@ class CustomColorViewController: OWSTableViewController2 {
})
}
@objc
private func didTapDone() {
showSaveUI()
}

View File

@ -35,9 +35,9 @@ class SAEFailedViewController: UIViewController {
override func loadView() {
super.loadView()
self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel,
target: self,
action: #selector(cancelPressed))
self.navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
self?.cancelPressed()
}
self.navigationItem.title = "Signal"
self.view.backgroundColor = Theme.launchScreenBackgroundColor
@ -83,8 +83,7 @@ class SAEFailedViewController: UIViewController {
// MARK: - Event Handlers
@objc
private func cancelPressed(sender: UIButton) {
private func cancelPressed() {
guard let delegate = delegate else {
owsFailDebug("missing delegate")
return

View File

@ -25,11 +25,10 @@ final class SAEScreenLockViewController: ScreenLockViewController {
super.loadView()
view.backgroundColor = Theme.launchScreenBackgroundColor
title = OWSLocalizedString("SHARE_EXTENSION_VIEW_TITLE", comment: "Title for the 'share extension' view.")
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .stop,
target: self,
action: #selector(dismissPressed)
)
navigationItem.leftBarButtonItem = .systemItem(.stop) { [weak self] in
Logger.debug("tapped dismiss share button")
self?.cancelShareExperience()
}
}
override func viewWillAppear(_ animated: Bool) {
@ -129,12 +128,6 @@ final class SAEScreenLockViewController: ScreenLockViewController {
private func cancelShareExperience() {
shareViewDelegate?.shareViewWasCancelled()
}
@objc
private func dismissPressed(_ sender: Any) {
Logger.debug("tapped dismiss share button")
cancelShareExperience()
}
}
extension SAEScreenLockViewController: ScreenLockViewDelegate {

View File

@ -165,6 +165,44 @@ public extension UIBarButtonItem {
// Keep a strong reference to the Handler
self.handler = handler
}
convenience init(
title: String,
style: UIBarButtonItem.Style,
action: @escaping () -> Void
) {
let handler = Handler(actionClosure: action)
self.init(title: title, style: style, target: handler, action: #selector(handler.action))
self.handler = handler
}
convenience init(
image: UIImage,
style: UIBarButtonItem.Style,
action: @escaping () -> Void
) {
let handler = Handler(actionClosure: action)
self.init(image: image, style: style, target: handler, action: #selector(handler.action))
self.handler = handler
}
}
/// Creates a bar button with the given title that performs the action in the provided closure.
static func button(
title: String,
style: UIBarButtonItem.Style,
action: @escaping () -> Void
) -> UIBarButtonItem {
ClosureBarButtonItem(title: title, style: style, action: action)
}
/// Creates a bar button with the given icon that performs the action in the provided closure.
static func button(
icon: ThemeIcon,
style: UIBarButtonItem.Style,
action: @escaping () -> Void
) -> UIBarButtonItem {
ClosureBarButtonItem(image: Theme.iconImage(icon), style: style, action: action)
}
// Keep this static function public instead of exposing ClosureBarButtonItem
@ -195,7 +233,7 @@ public extension UIBarButtonItem {
/// - completion: The block to execute after the view controller is dismissed.
/// - Returns: A new `UIBarButtonItem`.
static func cancelButton(
dismissingFrom viewController: UIViewController,
dismissingFrom viewController: UIViewController?,
animated: Bool = true,
completion: (() -> Void)? = nil
) -> UIBarButtonItem {
@ -214,7 +252,7 @@ public extension UIBarButtonItem {
/// - completion: The block to execute after the view controller is dismissed.
/// - Returns: A new `UIBarButtonItem`.
static func cancelButton(
dismissingFrom viewController: UIViewController,
dismissingFrom viewController: UIViewController?,
hasUnsavedChanges: @escaping () -> Bool?,
animated: Bool = true,
completion: (() -> Void)? = nil
@ -249,6 +287,27 @@ public extension UIBarButtonItem {
Self.systemItem(.done, action: action)
}
/// Creates a "Done" bar button which dismisses the view using the provided view controller.
/// - Parameters:
/// - viewController: The view controller to dismiss from.
/// - animated: Whether to animate the dismiss.
/// - completion: The block to execute after the view controller is dismissed.
/// - Returns: A new `UIBarButtonItem`.
static func doneButton(
dismissingFrom viewController: UIViewController?,
animated: Bool = true,
completion: (() -> Void)? = nil
) -> UIBarButtonItem {
Self.doneButton { [weak viewController] in
viewController?.dismiss(animated: animated, completion: completion)
}
}
/// Creates a flexible space bar item.
static func flexibleSpace() -> UIBarButtonItem {
UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
}
// Feel free to add more system item functions as the need arises
}

View File

@ -76,16 +76,7 @@ class DeleteSystemContactViewController: OWSTableViewController2 {
// manages to get here bad things could happen.
owsAssert(DependenciesBridge.shared.tsAccountManager.registrationStateWithMaybeSneakyTransaction.isRegisteredPrimaryDevice)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel)
)
}
@objc
private func didTapCancel() {
dismiss(animated: true)
self.navigationItem.leftBarButtonItem = .cancelButton(dismissingFrom: self)
}
override func viewWillAppear(_ animated: Bool) {

View File

@ -77,7 +77,9 @@ public class ContactShareViewController: OWSTableViewController2 {
override public func viewDidLoad() {
super.viewDidLoad()
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(didPressCancel))
navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
self?.didPressCancel()
}
if let title = shareDelegate?.titleForContactShareViewController(self) {
navigationItem.title = title
} else {
@ -199,7 +201,6 @@ public class ContactShareViewController: OWSTableViewController2 {
shareDelegate.contactShareViewController(self, didApproveContactShare: filteredContactShare)
}
@objc
private func didPressCancel() {
guard let shareDelegate else {
owsFailDebug("missing delegate.")

View File

@ -38,17 +38,15 @@ open class ContactPickerViewController: OWSViewController, OWSNavigationChildCon
public override func viewDidLoad() {
super.viewDidLoad()
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(didTapCancel)
)
navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
guard let self else { return }
self.delegate?.contactPickerDidCancel(self)
}
if allowsMultipleSelection {
navigationItem.rightBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .done,
target: self,
action: #selector(didTapDone)
)
navigationItem.rightBarButtonItem = .doneButton { [weak self] in
guard let self else { return }
self.delegate?.contactPicker(self, didSelectMultiple: self.selectedContacts)
}
}
addChild(tableViewController)
@ -282,18 +280,6 @@ open class ContactPickerViewController: OWSViewController, OWSNavigationChildCon
// callback when self.tableViews size is available.)
searchBar.layoutMargins = OWSTableViewController2.cellOuterInsets(in: view)
}
// MARK: Button Actions
@objc
private func didTapCancel() {
delegate?.contactPickerDidCancel(self)
}
@objc
private func didTapDone() {
delegate?.contactPicker(self, didSelectMultiple: selectedContacts)
}
}
extension ContactPickerViewController: UISearchBarDelegate {

View File

@ -203,8 +203,9 @@ open class ConversationPickerViewController: OWSTableViewController2 {
super.viewDidLoad()
if pickerDelegate?.conversationPickerCanCancel(self) ?? false {
let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(onTouchCancelButton))
self.navigationItem.leftBarButtonItem = cancelButton
self.navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
self?.onTouchCancelButton()
}
}
ensureSearchBarVisibility()
@ -533,7 +534,6 @@ open class ConversationPickerViewController: OWSTableViewController2 {
// MARK: - Button Actions
@objc
private func onTouchCancelButton() {
pickerDelegate?.conversationPickerDidCancel(self)
}

View File

@ -48,11 +48,9 @@ public class CountryCodeViewController: OWSTableViewController2 {
self.title = OWSLocalizedString("COUNTRYCODE_SELECT_TITLE", comment: "")
self.navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .stop,
target: self,
action: #selector(didPressCancel),
accessibilityIdentifier: "cancel")
self.navigationItem.leftBarButtonItem = .systemItem(.stop) { [weak self] in
self?.dismiss(animated: true)
}
createViews()
}
@ -90,11 +88,6 @@ public class CountryCodeViewController: OWSTableViewController2 {
searchBar.resignFirstResponder()
self.dismiss(animated: true)
}
@objc
private func didPressCancel() {
self.dismiss(animated: true)
}
}
// MARK: -

View File

@ -215,13 +215,12 @@ open class BaseMemberViewController: RecipientPickerContainerViewController {
return
}
if navigationController.viewControllers.count == 1 {
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done,
target: self,
action: #selector(dismissPressed))
navigationItem.leftBarButtonItem = .doneButton { [weak self] in
self?.dismissPressed()
}
}
}
@objc
open func dismissPressed() {
if !self.hasUnsavedChanges {
// If user made no changes, dismiss.

View File

@ -124,17 +124,11 @@ open class OWSTableViewController: OWSViewController {
public func present(fromViewController viewController: UIViewController) {
let navigationController = OWSNavigationController(rootViewController: self)
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .stop,
target: self,
action: #selector(donePressed(sender:)))
navigationItem.leftBarButtonItem = .systemItem(.stop) { [weak self] in
self?.dismiss(animated: true)
}
viewController.present(navigationController, animated: true)
}
@objc
private func donePressed(sender: Any) {
dismiss(animated: true)
}
}
extension OWSTableViewController: UITableViewDataSource, UITableViewDelegate {

View File

@ -1028,17 +1028,10 @@ extension OWSTableViewController2: UITableViewDataSource, UITableViewDelegate, O
public func present(fromViewController: UIViewController) {
let navigationController = OWSNavigationController(rootViewController: self)
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done,
target: self,
action: #selector(donePressed))
navigationItem.leftBarButtonItem = .doneButton(dismissingFrom: self)
fromViewController.present(navigationController, animated: true, completion: nil)
}
@objc
private func donePressed() {
self.dismiss(animated: true, completion: nil)
}
// MARK: - UIScrollViewDelegate
public func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {

View File

@ -97,11 +97,7 @@ public class FingerprintViewController: OWSViewController, OWSNavigationChildCon
super.init()
title = NSLocalizedString("PRIVACY_VERIFICATION_TITLE", comment: "Navbar title")
navigationItem.leftBarButtonItem = .init(
barButtonSystemItem: .done,
target: self, action: #selector(didTapDone),
accessibilityIdentifier: "FingerprintViewController.done"
)
navigationItem.leftBarButtonItem = .doneButton(dismissingFrom: self)
identityStateChangeObserver = NotificationCenter.default.addObserver(
forName: .identityStateDidChange,
@ -381,11 +377,6 @@ public class FingerprintViewController: OWSViewController, OWSNavigationChildCon
// MARK: Actions
@objc
private func didTapDone() {
dismiss(animated: true)
}
private func didTapLearnMore() {
Self.showLearnMoreUrl(from: self)
}

View File

@ -38,17 +38,10 @@ public class SpamCaptchaViewController: UIViewController, CaptchaViewDelegate {
isModalInPresentation = true
navigationItem.title = OWSLocalizedString("SPAM_CAPTCHA_VIEW_CONTROLLER", comment: "Title for the captcha view controller")
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .stop,
target: self,
action: #selector(didTapCancel)
)
}
@objc
private func didTapCancel() {
completionHandler?(nil)
completionHandler = nil
navigationItem.leftBarButtonItem = .systemItem(.stop) { [weak self] in
self?.completionHandler?(nil)
self?.completionHandler = nil
}
}
public func captchaView(_: CaptchaView, didCompleteCaptchaWithToken token: String) {

View File

@ -13,7 +13,7 @@ public class AllSignalConnectionsViewController: OWSTableViewController2 {
super.viewDidLoad()
title = OWSLocalizedString("ALL_SIGNAL_CONNECTIONS_TITLE", comment: "Title for the view of all your signal connections")
navigationItem.leftBarButtonItem = .init(barButtonSystemItem: .done, target: self, action: #selector(done))
navigationItem.leftBarButtonItem = .doneButton(dismissingFrom: self)
defaultSeparatorInsetLeading = Self.cellHInnerMargin + CGFloat(AvatarBuilder.smallAvatarSizePoints) + ContactCellView.avatarTextHSpacing
@ -21,11 +21,6 @@ public class AllSignalConnectionsViewController: OWSTableViewController2 {
updateTableContents()
}
@objc
private func done() {
dismiss(animated: true)
}
private func updateTableContents() {
let contents = OWSTableContents()
defer { self.contents = contents }

View File

@ -28,16 +28,17 @@ public class NewPrivateStoryRecipientsViewController: BaseMemberViewController {
}
private func updateBarButtons() {
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(dismissPressed))
navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
self?.dismissPressed()
}
navigationItem.rightBarButtonItem = UIBarButtonItem(
navigationItem.rightBarButtonItem = .button(
title: CommonStrings.nextButton,
style: .plain,
target: self,
action: #selector(nextPressed))
action: { [weak self] in
self?.nextPressed()
}
)
navigationItem.rightBarButtonItem?.isEnabled = hasUnsavedChanges
if recipientSet.isEmpty {
@ -56,7 +57,6 @@ public class NewPrivateStoryRecipientsViewController: BaseMemberViewController {
// MARK: - Actions
@objc
private func nextPressed() {
AssertIsOnMainThread()

View File

@ -39,15 +39,13 @@ public class SelectMyStoryRecipientsViewController: BaseMemberViewController {
}
private func updateBarButtons() {
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(dismissPressed))
navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
self?.dismissPressed()
}
navigationItem.rightBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .save,
target: self,
action: #selector(savePressed))
navigationItem.rightBarButtonItem = .systemItem(.save) { [weak self] in
self?.savePressed()
}
navigationItem.rightBarButtonItem?.isEnabled = hasUnsavedChanges
switch mode {
@ -84,7 +82,6 @@ public class SelectMyStoryRecipientsViewController: BaseMemberViewController {
// MARK: - Actions
@objc
private func savePressed() {
AssertIsOnMainThread()

View File

@ -86,7 +86,10 @@ public class TextApprovalViewController: OWSViewController, BodyRangesTextViewDe
comment: "Title for the 'message approval' dialog.")
}
self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelPressed))
self.navigationItem.leftBarButtonItem = .cancelButton { [weak self] in
guard let self else { return }
self.delegate?.textApprovalDidCancel(self)
}
footerView.delegate = self
@ -165,13 +168,6 @@ public class TextApprovalViewController: OWSViewController, BodyRangesTextViewDe
textView.textContainerInset = UIEdgeInsets(top: 10.0, left: 10.0, bottom: 10.0, right: 10.0)
}
// MARK: - Event Handlers
@objc
private func cancelPressed(sender: UIButton) {
delegate?.textApprovalDidCancel(self)
}
// MARK: - UITextViewDelegate
public func textViewDidChange(_ textView: UITextView) {