我正在制作一个ios应用程序,但是在使用switch语句查看是否按下了UIButton元素时遇到了问题。 这就是我希望最终产品发挥作用的人:我有多个无色图像(无色我指的是白色,UIImage)。当点击未着色的图像时,子视图打开时带有彩色框(UIButton,其中24个,每个都有单独的颜色)。选择彩色框按钮并按下工具栏上的后退按钮时,子视图将关闭,原始视图将重新显示,而未显示的图像(选择用于打开子视图的图像)现在使用在子视图中选择的所需颜色进行着色
我想使用switch语句来查找未选择的图像和选择的颜色(所有UIButton元素)。我不知道在switch语句中将什么作为表达式放置,因为我正在处理UIButtons。 switch语句的其余部分比较UIButton元素的值,看它是否等于YES(当按下按钮时),如果是,则返回一个字符串。我还想知道如何将IBAction连接到UIImage(因此当点击图像时,子视图打开)。
答案 0 :(得分:5)
我在iOS开发上有点生疏,但您可能会做以下事情:
将按钮设置为相同的事件处理程序,并使用sender属性访问按钮的标记元素,您可以为每个按钮指定。
- (IBAction) doStuff:(id) sender {
UIButton *button = (UIButton*) sender;
switch(button.tag)
{
//do stuff
}
如果这对您不起作用,您可以使用您认为合适的任何按钮属性来区分它们,例如标题,标题颜色等。
对于最佳实践,我建议您在尝试将其转换为对象之前检查发件人是否为UIButton类型。
答案 1 :(得分:1)
对于 Swift 3.0 ,我们不再需要观察标签了。只需保留对按钮的引用(IBOutlet或某些私有变量),然后使用Identifier Pattern
打开按钮本身。
import UIKit
class Foo {
// Create three UIButton instances - can be IBOutlet too
let buttonOne = UIButton()
let buttonTwo = UIButton()
let buttonThree = UIButton()
init() {
// Assign the same selector to all of the buttons - Same as setting the same IBAction for the same buttons
[buttonOne, buttonTwo, buttonThree].forEach{(
$0.addTarget(self, action: Selector(("buttonTapped")), for: .touchUpInside)
)}
}
func buttonTapped(sender: UIButton) {
// Lets just use the Identifier Pattern for finding the right tapped button
switch sender {
case buttonOne:
print("button one was tapped")
case buttonTwo:
print("button two was tapped")
case buttonThree:
print("button three was tapped")
default:
print("unkown button was tapped")
break;
}
}
}
// Example
let foo = Foo()
foo.buttonTapped(sender: foo.buttonOne)