多个按钮具有相同的功能吗?

时间:2016-02-02 15:39:33

标签: ios arrays swift uibutton swift2

我正在创建一个应用程序,我需要一个生成更多按钮的按钮。我的代码是这样的:

    func showButtons(array:Array<UIButton>)
{
    for(var i:Int = 0; i < array.count; i++)
    {
        array[i].setImage(UIImage(named: "StartButton.png"), forState: UIControlState.Normal)
        array[i].frame = CGRectMake(CGFloat(arc4random_uniform(200)), CGFloat(arc4random_uniform(200)), 100, 100)
        array[i].addTarget(self, action: "pressed", forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(array[i])
    }
}

按下的按钮是:

 func pressed(sender:AnyObject?)
{
    maybe()
}

但我知道这不是问题,因为另一个按钮不是以编程方式创建并且具有自己的动作功能,它使用相同的功能并且不会崩溃。

我的崩溃报告在这里:

  

(104.0,70.0)   2016-02-02 10:34:11.267测试[5150:1087940] - [Test.ViewController按下]:无法识别的选择器发送到实例0x7f8a8ac3be90   2016-02-02 10:34:11.283测试[5150:1087940] *由于未捕获的异常终止应用程序&#39; NSInvalidArgumentException&#39;,原因:&#39; - [Test.ViewController被按下]:无法识别选择器发送到实例0x7f8a8ac3be90&#39;   * 第一次抛出调用堆栈:   (       0 CoreFoundation 0x0000000101c81e65 exceptionPreprocess + 165       1 libobjc.A.dylib 0x00000001039c1deb objc_exception_throw + 48       2 CoreFoundation 0x0000000101c8a48d - [NSObject(NSObject)doesNotRecognizeSelector:] + 205       3 CoreFoundation 0x0000000101bd790a ___转发_ + 970       4 CoreFoundation 0x0000000101bd74b8 _CF_forwarding_prep_0 + 120       5 UIKit 0x00000001024a0194 - [UIApplication sendAction:to:from:forEvent:] + 92       6 UIKit 0x000000010260f6fc - [UIControl sendAction:to:forEvent:] + 67       7 UIKit 0x000000010260f9c8 - [UIControl _sendActionsForEvents:withEvent:] + 311       8 UIKit 0x000000010260eaf8 - [UIControl touchesEnded:withEvent:] + 601       9 UIKit 0x000000010250f49b - [UIWindow _sendTouchesForEvent:] + 835       10 UIKit 0x00000001025101d0 - [UIWindow sendEvent:] + 865       11 UIKit 0x00000001024beb66 - [UIApplication sendEvent:] + 263       12 UIKit 0x0000000102498d97 _UIApplicationHandleEventQueue + 6844       13 CoreFoundation 0x0000000101bada31 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 17       14 CoreFoundation 0x0000000101ba395c __CFRunLoopDoSources0 + 556       15 CoreFoundation 0x0000000101ba2e13 __CFRunLoopRun + 867       16 CoreFoundation 0x0000000101ba2828 CFRunLoopRunSpecific + 488       17 GraphicsServices 0x0000000106297ad2 GSEventRunModal + 161       18 UIKit 0x000000010249e610 UIApplicationMain + 171       19测试0x0000000101aa134d main + 109       20 libdyld.dylib 0x00000001044ca92d start + 1       21 ??? 0x0000000000000001 0x0 + 1   )   libc ++ abi.dylib:以NSException类型的未捕获异常终止   (lldb)

我相信我的问题是我已将所有e按钮附加到动作&#34;按下&#34;所以它发送了一个崩溃。有谁知道解决这个问题的方法/替换这个。我查看了显示如何以编程方式在Swift中创建UIButton的帖子。

2 个答案:

答案 0 :(得分:3)

您的代码与同一函数关联的UIButton的数量完全没有问题,因为您的函数接收参数,您在UIBUtton的选择器末尾缺少冒号在他的签名中,所以你需要更改以下行:

array[i].addTarget(self, action: "pressed:", forControlEvents:.TouchUpInside)

我希望这对你有所帮助。

答案 1 :(得分:2)

感谢上帝(或后者......)现在在Xcode 8 / Swift 3上语法更清晰,所以不需要添加(:_);编译器会找到该方法。

所以下面的代码工作正常:

override func viewDidLoad() {
    super.viewDidLoad()
    btn.addTarget(self, action: #selector(buttonTapped), for: UIControlEvents.touchUpInside)
}


final func buttonTapped(sender: UIButton){

}

如果你试图弄乱编译器,即:

final func buttonTapped(sender: UIButton. fake: int){..

您将被调用(因为签名正确..)但参数“fake”将从堆栈中获取垃圾。

当然:

final func buttonTapped(){..

工作并被称为。 (没有从堆栈中获取参数)。

顺便说一句,我更喜欢旧语法,每个参数需要多个“:”,如前面的代码所示:

"pressed:"