一个简单的问题,希望如此。为什么我为 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;
}
}
但是我在目标场景中遇到不兼容警告。
答案 0 :(得分:4)
这里有很多问题。
首先,永远不要永远,使用float
或类似类型的货币或其他确切的值。你将在计算中得到错误的答案。这是创建NSDecimal
和NSDecimalNumber
来解决的问题。
这引出了另一个问题:你想用数学做什么?:
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
进行后备存储,并从模型中更新所有视图。