Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么添加按钮会导致崩溃?_Ios_Swift_Uibutton - Fatal编程技术网

Ios 为什么添加按钮会导致崩溃?

Ios 为什么添加按钮会导致崩溃?,ios,swift,uibutton,Ios,Swift,Uibutton,我试图做的是有一个按钮,它将从UIPickerviewer中提取信息,然后将其添加到数组中,但当程序运行时,您点击该按钮,它将崩溃。非常新的编程在swift。。。我想要一个更好的解释 import UIKit class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { @IBOutlet weak var PickerView: UIPickerView! @I

我试图做的是有一个按钮,它将从UIPickerviewer中提取信息,然后将其添加到数组中,但当程序运行时,您点击该按钮,它将崩溃。非常新的编程在swift。。。我想要一个更好的解释

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    @IBOutlet weak var PickerView: UIPickerView!

    @IBOutlet var list: [UILabel]!

    @IBAction func add(_ sender: UIButton) {
        var shift = true
    }

    @IBOutlet weak var label: UILabel!


    var deviceList = [""]
    var shift = false


    override func viewDidLoad() {
        super.viewDidLoad()
        label.text = "Device List"
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    let devices = ["Mobile Phone","Microwave","Heater","Fridge","Router","Drill"]

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1            
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return devices[row]
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return devices.count
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        label.text = devices[row]
        if(shift == true){
            deviceList.append(label.text!)
            print(deviceList)
            shift = false
        }        
    }        
}

如果您在点击按钮时遇到崩溃,我假设有一些与
IBOutlet
事件引用冲突的分配。原因是因为您的
add(:)
操作方法除了创建一个名为
shift
的新布尔属性之外什么都没有做,而且即使它与类属性
shift
self.shift
)同名,实际上也不会导致崩溃。有时在interface builder中,您可能会有一个意外分配了多个事件的出口,而根据我的经验,如果删除代码中的一个事件,通常会导致崩溃。例如:假设您为按钮创建了一个事件(如
add(:)
),然后忘记并意外创建了第二个事件。然后,您意识到自己的错误,删除了第二个事件的代码,但不知道必须删除事件出口。Interface builder允许您犯此错误,但当您点击按钮时会导致应用程序崩溃,因为它试图调用一个不再存在的事件

如果您想通过IB检查是否有任何不必要的事件分配,control+使用Interface Builder单击屏幕左侧文档大纲中的按钮

您将看到“Referenceing outlets”(参考插座)标题下列出的参考插座。您可以通过单击左上角的小“X”删除任何不必要的内容。您还可以通过检查插座右侧是否有一个小圆圈来判断插座是否已连接(这意味着它已连接)。下面是一个示例,在本例中,我创建了一个对名为
tryAgain:
的方法的事件调用,然后将其删除。当我点击按钮时,它会导致崩溃

如果我单击“X”按钮并删除
tryAgain:
事件。单击按钮时,应用程序将工作


我不确定这是你的问题,但根据你分享的内容,我觉得这很可能。希望这有帮助。但是,我建议您在
add(:)
方法中实际执行一些代码。

您发布的iAction不应导致崩溃。您确实需要去掉函数体中的“var”一词,这样它就可以更改实例变量的状态,而不是设置一个从未执行任何操作但不会导致崩溃的局部变量

也就是说,您的“标签”插座被声明为隐式展开的可选插座,这对于插座来说是正常的:

@IBOutlet weak var label: UILabel!
但是,如果插座未连接到任何东西,则在您尝试读取或写入标签插座或标签的属性时,如果标签为nil,您将崩溃


检查您的插座是否正确连接。如果不是,那么我希望你在操作选择器时崩溃。(单击“添加”按钮时不会显示。)

请向我们显示控制台的错误文本/输出向我们提供您收到的完整错误消息,并告诉我们它在哪一行崩溃。否则我们无法帮助您。您对变量shift的重新声明无效,您已在主类和uibutton函数中声明了它。在@iAction之前移动var shift=false并删除函数体中的关键字var***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[hod.ViewController按钮按下:]:未识别的选择器发送到实例0x7ffcebc02e30'***第一次抛出调用堆栈: