ios 为什么要在UIButton中使用标记?

kninwzqo  于 2023-01-22  发布在  iOS
关注(0)|答案(3)|浏览(107)

我正在学习Swift,我有一个问题,当我们做一些按钮的Action函数时,有时会用到标签,毕竟要用代码设置按钮的标签,必须从故事板连接按钮的Outlet,为什么要用标签而不用Outlet的变量名呢?

l7wslrjt

l7wslrjt1#

任何数量的按钮可以有一个单一的动作,然后我们需要标记来区分基于按钮标记的动作。你实际上并不需要每个按钮的出口,如果你是从故事板设置标记,这里是关于标记的详细文章:
使用多个UIButton并利用其Tag属性

6yoyoihd

6yoyoihd2#

很多情况下,许多按钮都有相同的ibaction。在这种情况下,标签可以帮助

4ioopgfo

4ioopgfo3#

正如其他人所说,该函数可以完全独立于按钮,它可以完全在另一个类中。
按钮可能不在StoryBoards中,可以通过编程方式创建,也可能是动态创建,因此可能不需要检查传递给函数的按钮是否与局部变量相同(因为按钮可能不是函数所基于的类上的ivar)
标签给予了一种简单的方法来为按钮或视图提供一些标识符,当函数被调用时,可以交叉引用这些标识符,以实现所需的结果
下面是一个示例,请记住,这是为了提供详细信息而设计的
在ViewController中,你需要动态地创建一个按钮,但不想把它作为一个变量存储在VC中。你还有一个单独的类来处理点击
我们可以创建一个枚举来处理按钮类型,它处理按钮类型的标记和标题

enum ButtonType: String {
    case nonIvar
    case other
    
    var tag: Int  {
        switch self {
        case .nonIvar:
            return 0
        case .other:
            return 1
        }
    }
    
    var title: String {
        switch self {
        case .nonIvar:
            return "Non iVar Button"
        case .other:
            return "Some other Button"
        }
    }
}

然后我们有一个处理tap函数的类

class ButtonHandler {
    @IBAction func handleTap(_ sender: UIButton) {
        if sender.tag == ButtonType.nonIvar.tag {
            // do something with the none ivar buton
        } else {
            // handle other type
        }
    }
}

然后在视图控制器中创建按钮,将上面的两个示例连接起来

let handler = ButtonHandler()
func addMyButton() {
let myButton = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
let buttonType: ButtonType = .nonIvar
myButton.setTitle(buttonType.title, for: .normal)
myButton.tag = buttonType.tag
myButton.addTarget(self, action: #selector(handler.handleTap(_:)), for: .touchUpInside)
view.addSubview(myButton)
}

这意味着处理程序可以用于任何类,按钮类型可以在整个应用程序中平等使用,并且行为相同,无需重复代码
希望这有帮助!

相关问题