通过segue传递的值的Objective-C计算不起作用

时间:2012-08-15 19:18:56

标签: objective-c xcode nsstring segue calc

一个简单的问题,希望如此。为什么我为 lostWagesLabel totalNeedLabel 获得 0 - 在以下代码中计算了两个值?

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

三个值通过segue从父场景传递到此场景。当在此场景中显示为文本值时,所有三个值都会正确显示。但是当我运行NSLog时,只有一个值(Weeks)正确显示 - 这意味着其他两个值将作为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&的最小量运行它时,NSLog看起来像这样。父视频中的收入费用已禁用(*周*)为1:

2012-08-17 09:01:38.277 MyApp [8117:15203] 0 0 1

2012-08-17 09:01:38.279 MyApp [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;
    }
}

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

1 个答案:

答案 0 :(得分: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个月(对于某些月份的定义)。您不应该对这些值进行硬编码,而是使用各种date and time functions来根据需要进行数学运算。

最后,如果您不使用ARC,则会泄漏commas

<强>后续

查看更新的代码,我还有一些问题:

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

这应该做什么?你是不是只是设置了相同的值(虽然可能引入了一些不精确的因素)?

destViewController.earningsNumber = self->earningsLabel.text;

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

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