Ios 快速多个按钮通过同一段发送字符串

Ios 快速多个按钮通过同一段发送字符串,ios,swift,uistoryboardsegue,Ios,Swift,Uistoryboardsegue,寻找一些澄清,只是为了再次检查我是否在正确的道路上。我有一个类别列表,其中多个按钮将通过一个序列发送特定的字符串。我有每个按钮的IBOutlets,但我想确保当触摸到特定按钮时,会发送特定字符串。我只是不确定我设置segue的方式是否正确,因此每个按钮都是特定于设置字符串的。到目前为止,当前的segue适用于“attractionsButton”,但当我点击其他按钮时,它会传递相同的数据。我知道它没有设置,但我想确保当点击另一个按钮时,它不会发送错误的字符串 @IBOutlet weak var

寻找一些澄清,只是为了再次检查我是否在正确的道路上。我有一个类别列表,其中多个按钮将通过一个序列发送特定的字符串。我有每个按钮的IBOutlets,但我想确保当触摸到特定按钮时,会发送特定字符串。我只是不确定我设置segue的方式是否正确,因此每个按钮都是特定于设置字符串的。到目前为止,当前的segue适用于“attractionsButton”,但当我点击其他按钮时,它会传递相同的数据。我知道它没有设置,但我想确保当点击另一个按钮时,它不会发送错误的字符串

@IBOutlet weak var attractionsButton: UIButton!
@IBOutlet weak var eatingButton: UIButton!
@IBOutlet weak var financialButton: UIButton!
@IBOutlet weak var lodgingButton: UIButton!
@IBOutlet weak var medicalButton: UIButton!
@IBOutlet weak var publicButton: UIButton!
@IBOutlet weak var servicesButton: UIButton!
@IBOutlet weak var storesButton: UIButton!
@IBOutlet weak var transportationButton: UIButton!

let attractions = "Attractions & Entertainment"
let eating = "Eating & Drinking"
var financial = "Financial Institution"
var lodging = "Lodging Establishment"
var medical = "Medical & Health"
var publicService = "Public Services & Buildings"
var services = "Service"
var stores = "Stores & Shopping"
var transportation = "Transportation"


@IBAction func attractionsButton(_ sender: Any) {
    performSegue(withIdentifier: "category", sender: self)
}
@IBAction func eatingButton(_ sender: Any) {
    performSegue(withIdentifier: "category", sender: self)
}
@IBAction func financialButton(_ sender: Any) {
    performSegue(withIdentifier: "category", sender: self)
}
@IBAction func lodgingButton(_ sender: Any) {
    performSegue(withIdentifier: "category", sender: self)
}
@IBAction func medicalButton(_ sender: Any) {
    performSegue(withIdentifier: "category", sender: self)
}
@IBAction func publicButton(_ sender: Any) {
    performSegue(withIdentifier: "category", sender: self)
}
@IBAction func serviceButton(_ sender: Any) {
    performSegue(withIdentifier: "category", sender: self)
}
@IBAction func storesButton(_ sender: Any) {
    performSegue(withIdentifier: "category", sender: self)
}
@IBAction func transportationButton(_ sender: Any) {
    performSegue(withIdentifier: "category", sender: self)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)
    if segue.identifier == "category" {
        if let button1 = attractionsButton {
            let user = attractions
            let controller = segue.destination as? CategoryListedViewController
            controller?.categoryList = user
        }
    }
}

将您的操作中的self更改为sender,您可以对所有按钮使用此操作

@IBAction func transportationButton(_ sender: Any) {
        performSegue(withIdentifier: "category", sender: sender)
}
在准备赛格时使用此代码

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)
    if segue.identifier == "category" {

        let senderButton = sender as! UIButton

        switch senderButton{
        case attractionsButton:
            let user = attractions
            let controller = segue.destination as? CategoryListedViewController
            controller?.categoryList = user
        case eatingButton:
            //editing button scenario
            print("editing button scenario")
        default:
            //default code
            print("default scenario")
        }

    }
}

将您的操作中的self更改为sender,您可以对所有按钮使用此操作

@IBAction func transportationButton(_ sender: Any) {
        performSegue(withIdentifier: "category", sender: sender)
}
在准备赛格时使用此代码

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)
    if segue.identifier == "category" {

        let senderButton = sender as! UIButton

        switch senderButton{
        case attractionsButton:
            let user = attractions
            let controller = segue.destination as? CategoryListedViewController
            controller?.categoryList = user
        case eatingButton:
            //editing button scenario
            print("editing button scenario")
        default:
            //default code
            print("default scenario")
        }

    }
}

您的所有按钮都可以仅连接到此按钮
@IBAction

@IBAction func allButtons (_ sender: Any) {
    performSegue(withIdentifier: "category", sender: sender)
}
当然,如果这是所有按钮都在做的事情,那么您可以完全跳过使用
@IBAction
,直接从按钮连接分段。如果在脚本中创建第一个按钮时执行此操作,则可以复制该按钮,并且所有副本都将连接到同一个序列

然后在
prepare(for:sender:)
中,将发件人与您的
@IBOutlet
s进行比较,以设置字符串:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if let button = sender as? UIButton,
       let controller = segue.destination as? CategoryListedViewController,
       segue.identifier == "category" {

        let str: String

        switch button {
        case attractionsButton: str = attractions
        case eatingButton:      str = eating
        case financialButton:   str = financial
        default: str = ""
        }

        controller.categoryList = str
    }
}

您的所有按钮都可以仅连接到此按钮
@IBAction

@IBAction func allButtons (_ sender: Any) {
    performSegue(withIdentifier: "category", sender: sender)
}
当然,如果这是所有按钮都在做的事情,那么您可以完全跳过使用
@IBAction
,直接从按钮连接分段。如果在脚本中创建第一个按钮时执行此操作,则可以复制该按钮,并且所有副本都将连接到同一个序列

然后在
prepare(for:sender:)
中,将发件人与您的
@IBOutlet
s进行比较,以设置字符串:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if let button = sender as? UIButton,
       let controller = segue.destination as? CategoryListedViewController,
       segue.identifier == "category" {

        let str: String

        switch button {
        case attractionsButton: str = attractions
        case eatingButton:      str = eating
        case financialButton:   str = financial
        default: str = ""
        }

        controller.categoryList = str
    }
}

如果我是你,我会使用按钮标签和一个好的旧枚举来解决这个问题:

首先,在Interface Builder中,您可以设置每个按钮的
标记
属性(甚至不再需要将它们作为
@IBOutlet

1个用于吸引按钮,2个用于吃按钮等

然后,创建一个枚举,原始值为
Int
,具有匹配值:

enum Category : Int, CustomStringConvertible {
    case attractions = 1
    case eating = 2
    case financial = 3
    case lodging = 4
    case medical = 5
    case publicService = 6
    case services = 7
    case stores = 8
    case transportation = 9

    var description : String {
        switch self {
        case .attractions: return "Attractions & Entertainment"
        case .eating: return "Eating & Drinking"
        case .financial: return "Financial Institution"
        case .lodging: return "Lodging Establishment"
        case .medical: return "Medical & Health"
        case .publicService: return "Public Services & Buildings"
        case .services: return "Service"
        case .stores: return "Stores & Shopping"
        case .transportation: return "Transportation"
        }
    }
}
之后,您将所有按钮仅链接到一个
@IBAction
,如下所示:

@IBAction func onButtonTap(_ sender: UIButton) {
    performSegue(withIdentifier: "category", sender: Category(rawValue: sender.tag))
}
这样,根据按钮的标记,您将创建所需的枚举

最后,在你的赛格准备中,你可以这样设置:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "category" {
        guard
            let controller = segue.destination as? CategoryListedViewController,
            let category = sender as? Category
            else { return }

        controller.categoryList = category.description
    }
}

通过这种方式,事情变得更加简洁,您可以将更多行为附加到您的枚举
类别中,在开关中使用它,等等,而不是依赖
字符串
或复制粘贴代码。

如果我是您,我会使用按钮标记和一个好的旧枚举来解决这个问题:

首先,在Interface Builder中,您可以设置每个按钮的
标记
属性(甚至不再需要将它们作为
@IBOutlet

1个用于吸引按钮,2个用于吃按钮等

然后,创建一个枚举,原始值为
Int
,具有匹配值:

enum Category : Int, CustomStringConvertible {
    case attractions = 1
    case eating = 2
    case financial = 3
    case lodging = 4
    case medical = 5
    case publicService = 6
    case services = 7
    case stores = 8
    case transportation = 9

    var description : String {
        switch self {
        case .attractions: return "Attractions & Entertainment"
        case .eating: return "Eating & Drinking"
        case .financial: return "Financial Institution"
        case .lodging: return "Lodging Establishment"
        case .medical: return "Medical & Health"
        case .publicService: return "Public Services & Buildings"
        case .services: return "Service"
        case .stores: return "Stores & Shopping"
        case .transportation: return "Transportation"
        }
    }
}
之后,您将所有按钮仅链接到一个
@IBAction
,如下所示:

@IBAction func onButtonTap(_ sender: UIButton) {
    performSegue(withIdentifier: "category", sender: Category(rawValue: sender.tag))
}
这样,根据按钮的标记,您将创建所需的枚举

最后,在你的赛格准备中,你可以这样设置:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "category" {
        guard
            let controller = segue.destination as? CategoryListedViewController,
            let category = sender as? Category
            else { return }

        controller.categoryList = category.description
    }
}

通过这种方式,事情变得更加简洁,您可以将更多行为附加到枚举
类别中,在开关中使用它,等等,而不是依赖
字符串或复制粘贴代码。

您是如何添加
序列的?通过从按钮到其他控制器的控件单击?还是从一个控制器到另一个控制器?应该用前一种方法做。更重要的是,每个序列需要不同的标识符。您希望在不同的按钮上发送不同的字符串。但在每个按钮操作中,您都被设置为相同的字符串。我没有从按钮->控制器,而是从控制器->控制器。您的代码毫无意义。如果所有按钮都做相同的事情,为什么会有多个iAction功能?换言之:你在哪里编写代码来检查点击了哪个按钮?我没有看到任何这样的代码。请使用
performsgue
中的
sender
参数-它可以是您想要的任何内容。您是如何添加
segue
的?通过从按钮到其他控制器的控件单击?还是从一个控制器到另一个控制器?应该用前一种方法做。更重要的是,每个序列需要不同的标识符。您希望在不同的按钮上发送不同的字符串。但在每个按钮操作中,您都被设置为相同的字符串。我没有从按钮->控制器,而是从控制器->控制器。您的代码毫无意义。如果所有按钮都做相同的事情,为什么会有多个iAction功能?换言之:你在哪里编写代码来检查点击了哪个按钮?我没有看到任何这样的代码。请使用
performsgue
中的
sender
参数-它可以是您想要的任何东西。是的,谢谢。只要运行它就可以了。我不知道为什么有人会说在我的“func prepare”下为我的UIButton插座使用switch语句?这就是我所困惑的,谢谢你。只要运行它就可以了。我不知道为什么有人会说在我的“func prepare”下为我的UIButton插座使用switch语句?这就是我所困惑的