2015-10-07 2 views
-3

Я получаю сообщение об ошибке при создании простого проекта TableViewController, поскольку он выглядит так, как будто я пытаюсь заставить объект NSDecimalNumber в текст метки с именем CheckValue.text как часть метода cellForRowAtIndexPath ,[NSDecimalNumber Length]: нераспознанный селектор, отправленный в экземпляр

И, честно говоря, я пытаюсь сделать это, поскольку мне нужно оценить значение NSDecimalNumber, которое будет отображаться на TableCell. Может ли кто-нибудь помочь, поскольку я чувствую, что я рядом с пулей здесь?

Вот код из TableViewController.m

#import "TableViewController.h" 
#import "TableCell.h" 

@interface TableViewController() 
{ 
    NSMutableData *webData; 
    NSURLConnection *connection; 
    NSMutableArray *array; 
} 

@end 

@implementation TableViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Uncomment the following line to preserve selection between presentations. 
    // self.clearsSelectionOnViewWillAppear = NO; 
    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem; 
    // Get an array from web and Populate Check Arrays with New Data as above ... 

    [self GetDatabaseData]; 
} 

-(void)GetDatabaseData{ 
    NSURL *blogURL = [NSURL URLWithString:JSON_URL]; 
    NSData *jsonData = [NSData dataWithContentsOfURL:blogURL]; 
    NSError *error = nil; 

    //NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData: jsonData options:0 error:&error]; 
    NSArray *TransactionArray = [NSJSONSerialization JSONObjectWithData: jsonData options:0 error:&error]; 

    NSDecimalNumber *check_total = [NSDecimalNumber zero]; 

    NSString *current_check; 

    // Loop through Json objects, create question objects and add them to our questions array 
    for (int i = 0; i < TransactionArray.count; i++) 
    { 
     NSDictionary *jsonElement = TransactionArray[i]; 

     // Accumulate if this is part of the same check. 
     NSDecimalNumber *line_total = [NSDecimalNumber decimalNumberWithString:jsonElement[@"tran_value"]]; 

     // Decide if this is Element Belong to the Last Check number. 
     if (jsonElement[@"tran_check"] == current_check){ 
      check_total = line_total; // Reset Check Total to be the Value of this Line on NEW Checks 
     } 
     else{ 
      check_total = [check_total decimalNumberByAdding:line_total];  //Add this Line Value to the Running Check Total 
     } 

     current_check = jsonElement[@"tran_check"]; // Make this Check number the Current Check for Totalizing. 

     _Checknumbers = @[jsonElement[@"tran_check"]]; 
     _CheckTime = @[jsonElement[@"tran_hour"]]; 
     _CheckValue = @[check_total]; 
    } 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return _Checknumbers.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    static NSString *CellIdentifier = @"TableCell"; 

    TableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    int row = [indexPath row]; 

    cell.CheckLabel.text = _Checknumbers[row]; 
    cell.CheckValue.text = _CheckValue[row]; 
    cell.CheckTime.text = _CheckTime[row]; 

    return cell; 
} 

@end 
+0

Возможный дубликат [Как я могу отладить «непризнанный селектор послал к экземпляру» ошибки] (http://stackoverflow.com/questions/25853947/how-can-i-debug-unrecognized- selector-sent-to-instance-error) –

+0

Hi Hot Licks, мне удалось найти проблему с линией кода и знал, что нужно делать, просто не знал синтаксиса для этого преобразования. – Rob4236

ответ

-1

Вы можете форматировать строку со значением NSDecimalNumber

cell.CheckValue.text = [NSString stringWithFormat:@"%@",_CheckValue[row]] 
+0

Спасибо за это Борис, проверит код позже, когда вернусь домой. Перемещайтесь, если вы можете помочь в следующем вопросе: Как вы можете видеть, я просматриваю NSArray под названием TransactionArray, используя [i], однако внутри цикла вы можете видеть, что я заполняю 3 других NSArrays из Elements JSONElement. Нравится это: _Checknumbers = @ [jsonElement [@ "tran_check"]]; _CheckTime = @ [jsonElement [@ "tran_hour"]]; _CheckValue = @ [check_total]; Это, конечно, означает, что каждый из NSArrays содержит только последнее значение элементов из TransactionArray .... – Rob4236

+0

Как я могу добавить новое значение к каждому массиву в цикле вместо замены значения массива на простое этот 1 объект? – Rob4236

0

NSDecimalNumber унаследован от NSNumber так NSNumberFormatter верстальщик может быть использован, чтобы получить строковое представление вам нужно.

Вот пример, изменение в соответствии с вашими потребностями:

- (NSString *)formatNumber:(NSDecimalNumber *)number { 
    NSNumberFormatter *numberFormatter = [NSNumberFormatter new]; 
    [numberFormatter setMinimumFractionDigits:2]; 
    numberFormatter.usesGroupingSeparator = YES; 

    return [numberFormatter stringFromNumber:number]; 
} 

Примеры:

 
number  returns 
12456.3 12,456.30 
12   12.00 
12.3456  12.35 

Я использовал, что в приложении образец калькулятор.

Если метод formatNumber добавляется в TableViewController класс:

cell.CheckValue.text = [self formatNumber:_CheckValue[row]]; 

Для облегчения отладки (всегда хорошая вещь)

NSDecimalNumber *checkValueDecimal = _CheckValue[row]; 
NSString *checkValueString = [self formatNumber:_ checkValueDecimal]; 
cell.label.text = numberString; 

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

+0

Как использовать этот метод? cell.label.text = [formatNumber: NSDecimalNumber * somenumber]; ? – Rob4236

+0

Обновленный ответ. – zaph

0

UILabel отображает объекты класса NSString, вы прошли в качестве параметра NSDecimalNumber, когда вы установите текст проверяется входящие значения, включая длину (метод Длинна), потому что объект не поддерживает этот метод - возникает ошибка. Решение. Преобразуйте NSDecimalNumber в NSString. Например:

cell.CheckValue.text = [_CheckValue[row] stringValue]; 
+0

Я понимаю, теперь спасибо. Вы могли бы подумать, что этот тип передачи типов будет поднят, а этап сборки и не оставить его в Runtime ??? – Rob4236

+0

Вы можете установить тип объектов в массиве и принять предупреждение, но вы не можете передать это на этапе сборки – AshCenso

Смежные вопросы