0

所以我正在开发一个简单的计算器程序来习惯可可和目标 C。我已经多次重做整个事情,每次我完成编码时,我第一次构建它,它工作正常,但每次之后窗口不会启动,它给了我这些错误:

2013-01-11 10:32:14.760 Visual Caluclator Fix[39892:403] *** Assertion failure in -[NSTextFieldCell _objectValue:forString:errorDescription:], /SourceCache/AppKit/AppKit-1138.47/AppKit.subproj/NSCell.m:1564
2013-01-11 10:32:14.762 Visual Caluclator Fix[39892:403] Ignoring exception raised in __-[NSPersistentUIManager restoreAllPersistentStateWithTalagentWindows:registeringAsReadyWhenDone:completionHandler:]_block_invoke_3: Invalid parameter not satisfying: aString != nil

我得出的结论是问题出在我的 textEdited 方法上,因为当我将其中的代码注释掉时,程序运行没有问题;但是,我不知道为什么会这样,或者为什么它会第一次运行而不是任何后续时间。当我放入异常断点时,它会将我指向 updateUI 方法中的一行以及 textEdited 方法中对 [self updateUI] 的调用。下面的代码是 textEdited 方法和它引用的其他方法。(我很确定 solve 方法没有任何问题,因为我在命令提示符计算器中使用它并且效果很好。另外,我知道这是一个非常复杂的用字符串和所有东西编写计算器的方法,但我只是试图将我已经拥有的命令提示程序代码集成到可可程序中。)

在 AppDelegate 类中:

- (void)updateUI{
    [self.calculationView setStringValue: self.calculation.calcString];//Exception breakpoint points here
}

- (IBAction)textEdited:(id)sender {
    self.calculation.calcString = self.calculationView.stringValue;
    [self.calculation solve];
    [self updateUI];//Exception breakpoint points here
}

在计算类中:

- (NSString*)solve{
    for (int i = 0; i < [self.calcString length]; i++) {
        NSRange nextChar = NSMakeRange(i, 1);
        if ([[self.calcString substringWithRange: nextChar] isEqualToString: @"*"]||
            [[self.calcString substringWithRange: nextChar] isEqualToString: @"/"])
            [self calcTerm: i];
    }
    for (int i = 0; i < [self.calcString length]; i++) {
        NSRange nextChar = NSMakeRange(i, 1);
        if ([[self.calcString substringWithRange: nextChar] isEqualToString: @"+"]||
            [[self.calcString substringWithRange: nextChar] isEqualToString: @"-"])
            [self calcTerm: i];
    }
    return self.calcString;
}
4

2 回答 2

1

这可能有助于解决您的问题:

http://www.raywenderlich.com/10505/my-app-crashed-now-what-part-2

该站点解释了断言错误是如何工作的,并演示了如何修复这样的错误。

于 2013-01-12T01:58:06.563 回答
0

在我看来,其中的某些东西calcTerm:正在设置calcStringnil. 因此,当您稍后检索它以将字段的字符串值设置为它时,您最终将字段的字符串值设置为nil,这是它不喜欢的。

calcString您可以通过在结束之前记录 的值来检查这一点solve。然后,开始将日志语句和/或断点串起来,calcTerm:以了解如何将字符串换成nil.

于 2013-01-13T17:36:52.737 回答