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

时间:2017-01-11 17:32:26

标签: ios swift uibutton

我正在尝试做的是有一个按钮,它将从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
        }        
    }        
}

2 个答案:

答案 0 :(得分:0)

如果您在点击按钮时遇到崩溃,我会假设参与IBOutlet事件时存在一些冲突的分配。原因是因为你的add(_:)动作方法除了创建一个名为shift的新布尔属性之外没有做任何事情,即使它与类属性shift({{ 1}}),实际上不应该导致崩溃。有时在界面构建器中,您可能有一个意外分配了多个事件的插座,如果您删除了代码中的某个事件,这通常会导致我的体验崩溃。例如:假设您为按钮创建了一个事件(如self.shift),然后忘记并意外创建了第二个事件。然后你意识到你的错误并删除了第二个事件的代码,但不知道你必须删除事件插座。界面构建器将允许您犯这个错误,但是当您点击按钮时会导致应用程序崩溃,因为它正在尝试调用不再存在的事件。

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

enter image description here

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

enter image description here

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

我不确定这是你的问题,但根据你所分享的内容,听起来对我很不错。希望这可以帮助。不过,我建议您在tryAgain:方法中实际执行一些代码。

答案 1 :(得分:0)

您发布的IBAction没有任何内容可能导致崩溃。你需要在函数体中删除单词“var”,以便它改变实例变量的状态,而不是设置一个从不做任何事情的局部变量,但这不会导致崩溃。

那就是说,你的“标签”出口被宣布为一个隐含的未包装的选项,这对于网点来说是正常的:

@IBOutlet weak var label: UILabel!

如果插座没有连接任何东西,那么只要您尝试读取或写入标签插座或标签的属性,如果标签为零,您将崩溃。

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