如何将带有按钮发送器的功能移动到单独的文件中?

How to move function with button sender to a separate file?

我很难完成一项简单的任务。我用谷歌搜索了这个主题,但其他示例因我尚不理解的附加语法而变得复杂。你能帮我解决一下吗,或者如果已经有类似的话题就给link

我需要将负责选择按钮的函数移动到一个单独的文件中,因为如果按钮的数量增加,它会变成一个大的sheet。所以在单独的 swiftfile 中创建了一个函数,但是新文件自然不知道 viewController 中的任何按钮,也无法在范围内找到它。另外,如果我没记错的话,我需要给 Bool 和 return String.

如何将带有按钮发送器的函数传输到单独的文件,以便它 return 的非可选文本值返回 ViewController?

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var Label1: UILabel!
    @IBOutlet weak var BTC: UIButton!
    @IBOutlet weak var ETC: UIButton!
    @IBOutlet weak var LTC: UIButton!
    
    var choice = "Choose coin"
    var coinType = getCoinType()
    
    @IBAction func optionSelected(_ sender: UIButton) {
        BTC.isSelected = false
        ETC.isSelected = false
        LTC.isSelected = false
        sender.isSelected = true
        
        if BTC.isSelected == true{
            ETC.isSelected = false
            LTC.isSelected = false
            choice = "BTC"
            Label1.text = choice
        }else if ETC.isSelected == true{
            BTC.isSelected = false
            LTC.isSelected = false
            choice = "ETC"
            Label1.text = choice
        }else if LTC.isSelected == true{
            ETC.isSelected = false
            LTC.isSelected = false
            choice = "LTC"
            Label1.text = choice
        }
    }
    
}

新文件,我不明白如何从这里的按钮获取发件人

import Foundation

func getCoinType() -> String{
    var choice: String
    // my if else function
    return choice
}

P.S。一般来说,不使用 UIPickerView 是否可以使其更容易?

关于如何在不同的 swift 文件中添加函数,您有几种选择。这很简单:创建一个新的 swift 文件并将其命名为 ViewController+Extenstions.swift(您可以使用任何名称)。然后为您的 ViewController class 添加一个扩展,并像这样添加您的函数:

extension ViewController {

    func getCoinType() -> String {
        var choice: String
        // my if else function
        return choice
    }

}

您可以根据需要在不同的文件中添加任意数量的函数(ViewController 的所有扩展名,但当然具有不同的文件名)。

PS,在您的 optionSelected 函数中,您正在设置:

BTC.isSelected = false
ETC.isSelected = false
LTC.isSelected = false

我不知道你想要达到什么目的,但是这样做,那些 if-else 将永远不会被执行,因为你将三个按钮设置为 not-selected!

更新: 对于你的按钮选择问题,你可以这样做:

1- 为您的按钮添加标签 您可以在 viewDidLoad 方法中执行此操作。这样您就可以区分不同的按钮。

override func viewDidLoad() {
    super.viewDidLoad()
    
    BTC.tag = 0
    ETC.tag = 1
    LTC.tag = 2

}

2-连接按钮的动作 尽管您的三个按钮可以具有三个不同的处理程序函数,但将它们全部连接到一个处理程序会更容易。但是,我们可以根据我们在上一步中分配的标签的值知道点击了哪个按钮。所以,把所有的按钮都通过Storyboard连接到optionSelected(_ sender: UIButton)(因为你用过Storyboard.

3-重写getCoinType函数

func getCoinType(tag: Int) -> String? {
    var choice: String?
    switch tag {
    case 0:
        choice = "BTC"

    case 1:
        choice = "ETC"
    
    case 2:
        choice = "LTC"
    
    default:
        choice = nil
    }
    return choice
}

按钮的处理程序 现在,当点击一个按钮时,我们调用 getCoinType 函数,并将该按钮的标签作为输入参数。它将 return 字符串,我们将其分配给 Label1:

@IBAction func optionSelected(_ sender: UIButton) {

    let choice = getCoinType(tag: sender.tag)
    Label1.text = choice
}

大功告成!