Swift 在尝试访问分段控制索引时抛出错误

Posted

技术标签:

【中文标题】Swift 在尝试访问分段控制索引时抛出错误【英文标题】:Swift throws error when trying to access segmented control index 【发布时间】:2017-01-12 22:05:50 【问题描述】:

我目前正在学习 swift 并开始使用我自己的第一个计算器。 这一切都通过一个按钮来计算结果,但我想稍微改进一下。 UI 基本上由两个用于数字的文本字段、一个用于操作员的分段控件和一个用于显示结果的标签组成。所以这就是我想要发生的事情:

每次更改分段控制值时,都会计算并显示一个新的结果。

错误:

[Calculator.MainInterfaceViewController operatorChanged:]:无法识别的选择器发送到实例 XXXX ... * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[Calculator.MainInterfaceViewController operatorChanged:]:无法识别的选择器发送到实例 XXXX * 首先抛出调用栈: ... libc++abi.dylib:以 NSException 类型的未捕获异常终止 (lldb)

我的班级:

class MainInterfaceViewController: UIViewController, UITextFieldDelegate 

@IBOutlet var ersteZahl: UITextField!
@IBOutlet var zweiteZahl: UITextField!

@IBOutlet weak var ergebnisLabel: UILabel!
@IBOutlet weak var segment: UISegmentedControl!

override func viewDidLoad() 
    super.viewDidLoad()
    ersteZahl.delegate = self;
    zweiteZahl.delegate = self;


func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool 

    let newString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string) as NSString
    textField.text = newString as String
    refreshUIElements()
    return false


@IBAction func operatorChanged() 
    refreshUIElements()



func refreshUIElements() 
    let zahl1 = NSString(string: ersteZahl.text!).doubleValue
    let zahl2 = NSString(string: zweiteZahl.text!).doubleValue

    switch self.segment.selectedSegmentIndex 
    case 0:
        ergebnisLabel.text = "Ergebnis: \(zahl1 + zahl2)"
    case 1:
        ergebnisLabel.text = "Ergebnis: \(zahl1 - zahl2)"
    case 2:
        ergebnisLabel.text = "Ergebnis: \(zahl1 * zahl2)"
    case 3:
        if zahl2 == 0 
            ergebnisLabel.text = "Error: Cannot divide by 0."
            return
        
        ergebnisLabel.text = "Ergebnis: \(zahl1 / zahl2)"
    default:
        break
    




【问题讨论】:

你在哪里打电话给operatorChanged?问题是你的方法没有参数,但错误说它调用了一个同名但有参数的方法(后面有“:”)。你把它和故事板联系起来了吗?如果是,要么重命名 operatorChanged 以接受每个 IBAction 所做的事情,作为发件人,要么在 Storyboard 中重新链接它。 @Larme 是的,我通过我的主故事板链接了它。我已经尝试重新链接它。你知道如何解决它吗?非常感谢你:) 【参考方案1】:

我猜你在自动生成或尝试手动创建方法后修改了它?

@IBAction's 需要一个sender 参数。像这样的:

operatorChanged(sender: UISegmentedControl) 

完全删除该方法,然后再次从情节提要中按住 ctrl + 拖动到文件中。如果弹出窗口,请选择操作并为方法命名。在此之后不要修改方法定义,否则会导致同样的问题。

【讨论】:

以上是关于Swift 在尝试访问分段控制索引时抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

分段控制错误选择索引

分段错误:为什么这里的数组索引超出范围?

访问填充了从管道读取的数据的结构时出现分段错误

Swift - 如何让分段控制锁定在屏幕顶部

在 Swift 的标头中使用分段控件更改 UICollectionView 的内容

Alamofire Swift 5:传递参数时抛出错误