Нужна помощь в очень странном сложении и вычитании валюты iPhone - PullRequest
1 голос
/ 25 февраля 2012

Это сорта 'срочные', так как мое приложение только что заработало сегодня.

Мое приложение отлично работает в эмуляторе, прекрасно, когда я копирую его на телефон, iPad и другие айфоны. Мы проверили черт из приложения. Я отправил его в магазин приложений, и теперь он одобрен и работает, но ошибка возникает только в загруженном приложении.

По сути, я перебалансировал счет, используя NSDecimal и числовые форматеры. В эмуляторе и телефоне при шаге по коду все хорошо. Но парик из магазина приложений вышел. Похоже, что данные, которые я добавляю и вычитаю, не инициализируются.

Кто-нибудь когда-нибудь видел что-нибудь подобное?

Я знаю, что этот пост совершенно расплывчатый, но пытаюсь выяснить, с чего начать отладку, если код в эмуляторе работает нормально.

- ОБНОВЛЕНИЕ-- добавление кода

 -(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];
}

}

Ответы [ 2 ]

0 голосов
/ 05 марта 2012

В моем методе была проблема с мертвым хранилищем с 2 переменными. Несмотря на то, что я установил их позже, я удалил их и повторно отправил приложение. Проблема ушла.

Спасибо за ваши советы.

0 голосов
/ 29 февраля 2012

Я думаю, что проблема заключается в вашей попытке использовать UITableViewCells для хранения данных. Вы не помещаете данные в ячейки, вы ждете, пока UITableView вызовет ваш метод cellForRowAtIndexPath.

UITableView сохранит только достаточно ячеек, чтобы заполнить экран. Как только кто-то прокрутится из поля зрения, он будет выпущен. Когда ваш цикл попытается получить его снова с помощью cellForRowAtIndexPath: он выделит новую ячейку, чтобы дать вам. Хотя ваш цикл может его инициализировать, он не будет сохранен или использован объектом UITable.

...