【问题标题】:Have multiple buttons have the same function?是否有多个按钮具有相同的功能?
【发布时间】:2016-05-11 12:08:55
【问题描述】:

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

    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] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[Test.ViewController 已按下]:无法识别的选择器发送到实例 0x7f8a8ac3be90” * 首先抛出调用栈: ( 0 CoreFoundation 0x0000000101c81e65 异常预处理 + 165 1 libobjc.A.dylib 0x00000001039c1deb objc_exception_throw + 48 2核心基础0x0000000101c8a48d-[NSObject(NSObject)不识别选择器:]+205 3 核心基础 0x0000000101bd790a ___forwarding_ + 970 4 核心基础 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 发送事件:] + 865 11 UIKit 0x00000001024beb66-[UIApplication sendEvent:] + 263 12 UIKit 0x0000000102498d97 _UIApplicationHandleEventQueue + 6844 13 核心基础 0x0000000101bada31 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 17 14 核心基础 0x0000000101ba395c __CFRunLoopDoSources0 + 556 15 核心基础 0x0000000101ba2e13 __CFRunLoopRun + 867 16 核心基础 0x0000000101ba2828 CFRunLoopRunSpecific + 488 17 图形服务 0x0000000106297ad2 GSEventRunModal + 161 18 UIKit 0x000000010249e610 UIApplicationMain + 171 19 测试 0x0000000101aa134d 主要 + 109 20 libdyld.dylib 0x00000001044ca92d 开始 + 1 21 ??? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib:以 NSException 类型的未捕获异常终止 (lldb)

我相信我的问题是我将所有 e 按钮都附加到“按下”操作,因此它会发送崩溃。有谁知道解决此问题/替换此问题的方法。我查看了展示如何在 Swift 中以编程方式制作 UIButton 的帖子。

【问题讨论】:

  • 你按下的功能是什么?你的崩溃是什么?
  • 我按下的函数绝对不是问题,因为它只是调用另一个函数,而我有一个不同的按钮调用该函数并且没有崩溃。
  • 无论如何,请连同您看到的崩溃消息一起发布。问题可能是您如何将目标添加到按钮。
  • 好吧,等一下……
  • “按下”按钮是否有任何参数?如果你应该在动作参数中添加“pressed:”而不是“pressed”。

标签: ios arrays swift uibutton swift2


【解决方案1】:

感谢上帝(或 Latter...)现在 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:"

【讨论】:

    【解决方案2】:

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

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

    希望对你有所帮助。

    【讨论】:

    • 这就是答案!不过请给我一点标记,因为我要等两分钟……
    • 是的,这基本上就是我的想法
    • 是的,因为我看到了我正在等待他发布错误以正确回答的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多