Как правильно изменить действие кнопки IBAction с помощью оператора swift? - PullRequest
2 голосов
/ 28 апреля 2019

Я поднял этот вопрос в одном из моих других вопросов, но я работаю над текстовой приключенческой игрой, разработанной для IOS.

Одна из вещей, над которыми я работаю, - это дать кнопке несколько различных функций в определенных обстоятельствах. Я прочитал в нескольких других сообщениях, что я могу достичь этого, используя быстрые заявления, и я несколько преуспел в изменении действия, однако это не правильное действие.

Как показано ниже, большая часть моей истории и то, какие опции игроку предоставлены, хранятся в структуре и могут переключаться с помощью метода PickStory.

func mainStory()
{
    Storys =
        [Story(Story: "You are walking along a dirt path and come to a cross roads. You see a small shack just off the trail. What do you want to do?", Action: "Heal", North: true, South: true, East: false, West: false, storyProg: true, resultN: "You walk north and see a gate in the distance.", resultS: "Their is nothing to turn back for.", resultE: "", resultW: ""),

         Story(Story: "You see a small gate at the end of the dirt path, and their is a gaurd standing infront of the gate.", Action: "Approach", North: true, South: true, East: true, West: true, storyProg: false, resultN: "", resultS: "", resultE: "", resultW: ""),

         Story(Story: "You see a small well in the middle of town.", Action: "Attack", North: true, South: true, East: true, West: true, storyProg: false, resultN: "", resultS: "", resultE: "", resultW: "")]


    PickStory()
}

func PickStory()
{
    if Storys.count > 0
    {
        storyNum = 0
        storyLabel.text = Storys[storyNum].Story
        actionButton.setTitle(Storys[storyNum].Action, for: UIControl.State.normal)

        adjustButtons(North: Storys[storyNum].North,
                      South: Storys[storyNum].South,
                      East: Storys[storyNum].East,
                      West: Storys[storyNum].West)

        Storys.remove(at: storyNum)
    }
    else
    {
        NSLog("Done!")
    }
}

Теперь, когда текст кнопки «Действие» установлен в методе PickStory, фактические действия изменяются в методе фактической кнопки, который следует после нескольких строк (обратите внимание, что операторы print являются только временными заполнителями для методов, которые будет размещен позже).

@IBAction func actionButton(_ sender: Any)
{
    switch Storys[storyNum].Action
    {
        case "Attack":
            print("Attacking")
            break
        case "Heal":
            print("Healing")
            break
        case "Approach":
            print("Approaching")
            break
    default:
        break
    }
}

Чтобы подвести итог проблемы, текст изменится на правильное действие, но фактическое действие не изменится.

Мое первоначальное предположение заключалось в том, что поскольку actionButton появляется спустя некоторое время, после метода PickStory, он будет читать следующую статью после удаления индекса. Тем не менее, я не могу добиться прогресса в истории без удаления индексов.

1 Ответ

2 голосов
/ 28 апреля 2019

Вы не можете отправлять параметры через действие селектора, но вы можете создать подкласс UIButton для добавления настраиваемого свойства, которое может быть любым.

import UIKit

class CustomButton: UIButton {
    var storyAction: String

    override init(frame: CGRect) {
        self.storyAction = ""
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        self.storyAction = ""
        super.init(coder: aDecoder)
    }
}

Вы можете установить это свойство, когда задаете заголовок:

let action = Storys[storyNum].action // Customary to use lower case for instance properties and upper case for classes
actionButton.setTitle(action, for: UIControl.State.normal)
actionButton.storyAction = action

Вы можете проверить это в операторе switch.

@IBAction func actionButton(_ sender: CustomButton)
{
    switch sender.storyAction
    {
        case "Attack":
            print("Attacking")
            break
        case "Heal":
            print("Healing")
            break
        case "Approach":
            print("Approaching")
            break
    default:
        break
    }
}

Обратите внимание, что я назвал свойство storyAction, чтобы не вступать в конфликт с ранее существовавшей кнопкой action property.


Может быть безопаснее использовать enum для всех типов storyAction вместо строк.Это упростит гарантию того, что не было ошибок орфографии, вызывающих проблемы!

enum StoryAction {
    case attack
    case heal
    case approach
}

Это может быть расширено столько, сколько вам нужно.Это легко проверить в операторе switch с case .attack и т. Д.

...