0

一个简单的问题,希望。为什么我的lostWagesLabeltotalNeedLabel为0 - 以下代码中计算的两个值?

编辑:原始问题完全替换为以下代码-根据迄今为止收到的建议进行了更新:

三个值通过 segue 从父场景传递到此场景。当在此场景中显示为文本值时,所有三个值都会正确显示。但是当我运行 NSLog 时,只有一个值(周)正确显示 - 这意味着其他两个值将作为 0 进入计算。

以下是父场景中的声明:

IBOutlet UISlider *earningsSlider;
IBOutlet UILabel *earningsLabel;
IBOutlet UISlider *disabledSlider;
IBOutlet UILabel *disabledLabel;
IBOutlet UISlider *expensesSlider;
IBOutlet UILabel *expensesLabel;

这是一个实现示例:

- (IBAction)earningsSlide:(id)sender {
    NSNumberFormatter *commas = [NSNumberFormatter new];
    commas.numberStyle = NSNumberFormatterDecimalStyle;
    int earningsValue = (int)(earningsSlider.value / 1000.0);
    [earningsSlider setValue:earningsValue * 1000.0];
    earningsLabel.text = [NSString stringWithFormat:@"$%@", 
                         [commas stringFromNumber:[NSNumber numberWithFloat:earningsValue * 1000]]];
}

这是所有东西都通过segue的地方:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"DisabilitySegue"]) {
        DisabilityViewController *destViewController = segue.destinationViewController;
        destViewController.earningsNumber = self->earningsLabel.text;
        destViewController.expensesNumber = self->expensesLabel.text;
        destViewController.disabledNumber = self->disabledLabel.text;
    }
}

以下是新场景中的声明:

@property (nonatomic, strong) IBOutlet UILabel *earningsLabel;
@property (nonatomic, strong) NSString *earningsNumber;
@property (nonatomic, strong) IBOutlet UILabel *expensesLabel;
@property (nonatomic, strong) NSString *expensesNumber;
@property (nonatomic, strong) IBOutlet UILabel *disabledLabel;
@property (nonatomic, strong) NSString *disabledNumber;
@property (nonatomic, strong) IBOutlet UILabel *message;
@property (nonatomic, strong) NSString *lostWages;
@property (nonatomic, strong) IBOutlet UILabel *lostWagesLabel;
@property (nonatomic, strong) NSString *totalNeed;
@property (nonatomic, strong) IBOutlet UILabel *totalNeedLabel;

这是当前状态下的实现:

- (void)viewDidLoad
{
    NSNumberFormatter *commas = [NSNumberFormatter new];
    commas.numberStyle = NSNumberFormatterDecimalStyle;
    earningsLabel.text = earningsNumber;
    expensesLabel.text = expensesNumber;
    disabledLabel.text = disabledNumber;
    int earn = [earningsNumber intValue];
    int expense = [expensesNumber intValue];
    int weeks = [disabledNumber intValue];
    NSLog(@"%d %d %d",earn,expense,weeks);
    //print values to console
    int lost = (int)(earn / 52 * weeks);
    int need = (int)(expense * 12 / 52 * weeks);
    NSLog(@"%d %d",lost,need);
    //print values to console
    lostWages = [NSString stringWithFormat:@"$%@",
                        [commas stringFromNumber:[NSNumber numberWithInteger:lost]]];
    totalNeed = [NSString stringWithFormat:@"$%@",
                        [commas stringFromNumber:[NSNumber numberWithInteger:need]]];
    lostWagesLabel.text = lostWages;
    totalNeedLabel.text = totalNeed;

    [super viewDidLoad];
}

当我在父场景中使用尽​​可能少的 1000、100 和 1 作为收入费用禁用周)运行 NSLog 时,NSLog 看起来像这样:

2012-08-17 09:01:38.277 我的应用程序 [8117:15203] 0 0 1

2012-08-17 09:01:38.279 我的应用程序 [8117:15203] 0 0

我还尝试更改通过 segue 发送的内容的格式,并将其作为父场景中的声明:

@interface IncomeProtectionViewController : UIViewController {

    IBOutlet UISlider *earningsSlider;
    IBOutlet UISlider *expensesSlider;
    IBOutlet UISlider *disabledSlider;
    IBOutlet UILabel *earningsLabel;
    IBOutlet UILabel *expensesLabel;
    IBOutlet UILabel *disabledLabel;
    NSNumber *earningsNumber;
    NSNumber *expensesNumber;
    NSNumber *disabledNumber;
}

这在实现中:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"DisabilitySegue"]) {
        DisabilityViewController *destViewController = segue.destinationViewController;
        destViewController.earningsNumber = self->earningsNumber;
        destViewController.expensesNumber = self->expensesNumber;
        destViewController.disabledNumber = self->disabledNumber;
    }
}

但是我在目标场景中收到了不兼容警告。

4

1 回答 1

4

这里有很多问题。

首先,永远,永远,永远,使用float或类似类型的货币或其他精确值。你在计算中得到错误的答案。这就是创建并解决的问题NSDecimalNSDecimalNumber

这就引出了另一个问题:你想用数学做什么?:

int need = (int)(expense * 12 / 52 * weeks);

好的,所以您已经完成了一些浮点数学运算,然后将结果转换为int. (通常您可能希望使用 NSInteger,但我们将把它放在一边。)这意味着任何小于 1 的值都将向下舍入为零,这可能是您的问题,具体取决于您的输入。(我猜这就是你的问题所在;使用调试器检查你的值!)

totalNeed = [NSString stringWithFormat:@"$%@",
                    [commas stringFromNumber:[NSNumber numberWithFloat:need]]];

那么,鉴于上述情况,您为什么要+numberWithFloat:使用int? 我认为这不会自行中断,但它仍然不是真正正确的。

顺便说一句,我猜你的整数文字(12 和 52)来自日历(每年 12 个月,每年 52 周)。如果不是,您可以忽略这一点,但如果是,那么这也是错误的:并非所有年份都有 52 周,并非所有年份都有 12 个月(对于月份的某些定义)。您不应对此类值进行硬编码,而应根据需要使用各种日期和时间函数进行数学运算。

最后,如果你不使用 ARC,你就是在泄漏commas.

跟进

查看您更新的代码,我还有几个问题:

int earningsValue = (int)(earningsSlider.value / 1000.0);
[earningsSlider setValue:earningsValue * 1000.0];

这是要做什么?您不是只是设置了相同的值(尽管可能引入了一些不精确)?

destViewController.earningsNumber = self->earningsLabel.text;

不是访问对象的属性或实例变量的正确方法。 ->取消引用结构指针的成员。您大概想使用self.earningsLabelor [self earningsLabel]

最后,将视图与模型混合在一起通常是不明智的。例如,这里您似乎使用标签文本作为支持数据的表示,然后强制进行大量类型转换等。最好有一个模型对象,可能NSDecimalNumber用于支持存储,并从模型中更新您的视图。

于 2012-08-15T19:38:27.977 回答