需要关于非常奇怪的iPhone货币加法和减法的帮助



由于我的应用程序今天刚刚上线,所以这很紧急。

我的应用程序在模拟器中运行良好,当我将其复制到手机、iPad和其他iPhone时运行良好。我们测试了这个应用程序。我将它提交到了应用商店,现在它已被批准并处于活动状态,但只有下载的应用商店应用程序才会出现错误。

基本上,我正在使用NSDecimal和数字格式化程序重新平衡账单。在模拟器和手机中,当我逐步完成代码时,一切都很好。但应用商店的捆绑包已经过时了。似乎我正在添加和减去的数据没有初始化。

有人见过这样的东西吗?

我知道这篇文章非常模糊,但我想弄清楚如果模拟器中的代码运行良好,从哪里开始调试。

--UPDATE—添加代码

 -(void)balanceBill:(UITextField*)textField 
 {
//save the text field data
int row                         = [textField tag] - 900;
NSString *enteredSplitAmount    = [formatter stringWithNoCurrency:[textField text]];
[theGuestTotals replaceObjectAtIndex:row withObject:enteredSplitAmount];
//Get data object
BillDataObject* data    = [self theAppDataObject];
int changedSplitBy  = 0;
UITableViewCell *cell;
UITextField     *cellTextField;
double          adjustedBill = 0.0;
NSString        *guestAmountFromArray;
//NSString        *guestAmountAdjusted;
//Figure out how many guests did NOT have their bill changed & get new bill total
for (NSUInteger i=0; i < [theGuestTotals count]; i++)
{
    guestAmountFromArray        = [theGuestTotals objectAtIndex:i];
    if ([guestAmountFromArray   isEqualToString:data.splitByAmountChanged]) 
    {
        changedSplitBy++;
    }    
    //Adding ALL guest amounts to get a NEW Bill Total
    adjustedBill += [guestAmountFromArray doubleValue];
}
if (changedSplitBy == 0)
    changedSplitBy = 1;

//Convert newBill to decimal
NSDecimalNumber *adjustedBillTotal = [[NSDecimalNumber alloc] initWithDouble:adjustedBill];
NSDecimalNumber *originalBillTotal = [[NSDecimalNumber alloc] initWithString:data.totalBill];    
NSDecimalNumber *splitBy = [[NSDecimalNumber alloc] initWithInt:changedSplitBy];
NSDecimalNumber *updatedGuestAmount;
//Figure out the the difference is between the new amount and the old amount
NSDecimalNumber *adjustedBillTotalDifference = [originalBillTotal decimalNumberBySubtracting:adjustedBillTotal];
//figure out the difference each guest who did not have their bill changed difference
NSDecimalNumber *guestSplitAmountDifference = [adjustedBillTotalDifference decimalNumberByDividingBy:splitBy];
//loop through array of guest totals to see if a guest total if different from the original split amout
for (NSUInteger i=0; i < [theGuestTotals count]; i++)
{
    guestAmountFromArray = [theGuestTotals objectAtIndex:i];
    if ([guestAmountFromArray isEqualToString:data.splitByAmountChanged]) 
    {
        NSDecimalNumber *guestAmount = [[NSDecimalNumber alloc] initWithString:[theGuestTotals objectAtIndex:i]];
        NSIndexPath *indexPath  = [NSIndexPath indexPathForRow:i inSection:0];
        cell                    = [tableView cellForRowAtIndexPath:indexPath];
        cellTextField           = (UITextField*)[cell viewWithTag:i+900];
        //add the split amount to the guest amount
        updatedGuestAmount = [guestAmount decimalNumberByAdding:guestSplitAmountDifference];
        //update the textfield with UPDATED amount
        cellTextField.text      = [formatter stringWithNumberStyle:NSNumberFormatterCurrencyStyle numberToFormat:updatedGuestAmount];            
        //replace the guest amount in the array with the UPDATED amount
        [theGuestTotals         replaceObjectAtIndex:i withObject:[formatter stringWithNumberStyle:NSNumberFormatterDecimalStyle numberToFormat:updatedGuestAmount]];
    } else {
        //Not equal so just update the amount from what it was...
        //this might not be needed but I need to format if it is...
        cellTextField.text      = [formatter stringWithNumberStyle:NSNumberFormatterCurrencyStyle numberToFormat:            [NSDecimalNumber decimalNumberWithString:guestAmountFromArray]];
    }
}
//Now all guests who were not edited GOT updated now save that update for the next time this function is run
data.splitByAmountChanged = [formatter stringWithNumberStyle:NSNumberFormatterDecimalStyle numberToFormat:updatedGuestAmount];
//Clear out adjustedBill to get NEW totals after we updated each guest in the loop above
adjustedBill = 0;
//Lets see if we are over or under and do the 'REDISTRIBUTE'
for (NSUInteger i=0; i < [theGuestTotals count]; i++)
{
    adjustedBill += [[theGuestTotals objectAtIndex:i] doubleValue];
}
adjustedBillTotal = [[NSDecimalNumber alloc] initWithDouble:adjustedBill];
if ([originalBillTotal compare:adjustedBillTotal] == NSOrderedAscending) 
{  
    [warningImage setHidden:NO];
    NSDecimalNumber *overage = [adjustedBillTotal decimalNumberBySubtracting:originalBillTotal];
    [overUnderLabel setText:[NSString stringWithFormat:@"%@ over",[formatter stringWithNumberStyle:NSNumberFormatterCurrencyStyle numberToFormat:overage]]];
   // [self disableDone];
    [self enableRedistribute];
} 
else if ([originalBillTotal compare:adjustedBillTotal] == NSOrderedDescending) 
{
    [warningImage setHidden:NO];        
    NSDecimalNumber *underage = [originalBillTotal decimalNumberBySubtracting:adjustedBillTotal]; 
    [overUnderLabel setText:[NSString stringWithFormat:@"%@ under",[formatter stringWithNumberStyle:NSNumberFormatterCurrencyStyle numberToFormat:underage]]];
   // [self disableDone];
    [self enableRedistribute];
} 
else 
{
    [warningImage setHidden:YES];        
    overUnderLabel.text = @"";
    //[self enableDone];
    [self disableRedistribute];
}

}

我认为问题在于您试图使用UITableViewCells进行数据存储。您不将数据推入单元格,而是等待UITableView调用您的cellForRowAtIndexPath方法。

UITableView将只保留足够的单元格来填充屏幕。一旦一个滚动离开视线,它就会被释放。当您的循环尝试使用cellForRowAtIndexPath:再次检索它时,它将分配一个新的单元格给您。虽然您的循环可能会初始化它,但它不会被UITable对象存储或使用。

我的方法中有两个变量存在死存储问题。尽管我后来设置了它们,但我还是删除了它们并重新提交了应用程序。这个问题消失了。

谢谢你的建议。

最新更新