Как программно изменить функциональность UIBarButtunItem в Xcode swift - PullRequest
1 голос
/ 14 марта 2019

В моем проекте XCode у меня есть элемент Bar Button и две функции @IBAction в файле swift.Первый - @IBAction func editObjectsAction(_ sender: UIBarButtonItem), а второй - @IBAction func cancelAction(_ sender: UIBarButtonItem).Когда пользователь нажимает кнопку в первый раз, начинает работать первая функция.Я хочу заставить работать вторую функцию, когда пользователь нажимает кнопку в следующий раз.Как я могу организовать это программно в первой функции?

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Ваш подход выглядит необычно для меня. Вам лучше иметь одно действие, которое может сделать последующий вызов соответствующих методов в зависимости от текущего состояния (которое не привязано к кнопке панели). Однако, поскольку сам вопрос заключается в том, как программно установить действие UIBarButtonItem, я отвечу на него ниже.

UIBarButtonItem имеет свойства target и action, которые имеют выставленные сеттеры. Вы можете установить их во время выполнения всякий раз, когда вам нужно, но ваши селекторы должны быть доступны во время выполнения obj-c:

@objc private func editObjectAction(_ sender: UIBarButtonItem) {
    sender.action = #selector(cancelAction(_:))
}

@objc private func cancelAction (_ sender: UIBarButtonItem) {
    sender.action = #selector(editObjectAction(_:))
}

Имейте в виду, что приведенный выше код работает, только если свойство target элемента установлено на владельца методов (чаще всего это должно быть self)

0 голосов
/ 14 марта 2019

Нет необходимости использовать два разных @IBActions. Вы можете заставить его работать, выполнив следующие шаги:

Шаг 1:

Создать одну глобальную логическую переменную

var isFirstClickDone: Bool! = false

Шаг 2

Теперь создайте две разные функции для выполнения желаемых функций.

func editAction() {
   // put the logic for edit in this method
}

func cancelAction() {
   // put the logic for cancel in this method
}

Шаг 3

Создайте IBAction, как вы уже создали, затем назначьте его на BarButton и поместите в него логику, как показано ниже

@IBAction func buttonPressed(_ sender: UIBarButtonItem) {

    if !isFirstClickDone {

       editAction()
       isFirstClickDone = true

    }else {

       cancelAction()
       isFirstClickDone = false

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...