【问题标题】:App crashes when trying to use float value IOS尝试使用浮点值 IOS 时应用程序崩溃
【发布时间】:2014-10-06 14:09:17
【问题描述】:

我有一个NSMutableDicitonary,在其中我将字典中的对象保存到NSMutableArray

我的问题是,当我尝试将 NSMutableArray 的总和相加时,它会因

而崩溃
 self.viewOrderSummaryDictionary = [[NSMutableDictionary alloc] init];
        [self.viewOrderSummaryDictionary setObject: [self.viewSelectedItemsArray valueForKey:@"MenuItemName"]   forKey: @"description"];
        [self.viewOrderSummaryDictionary setObject: [self.viewSelectedItemsArray valueForKey:@"MenuItemImage"] forKey: @"imageUrlString"];
        [self.viewOrderSummaryDictionary setObject: [self.viewSelectedItemsArray valueForKey:@"MenuItemPrice"]    forKey: @"price"];
        [self.viewOrderSummaryDictionary setObject: [self.viewSelectedItemsArray valueForKey:@"MenuItemCurrency"] forKey: @"currency"];
        [self.viewOrderSummaryDictionary setObject: [self.viewSelectedItemsArray valueForKey:@"MenuItemId"]  forKey: @"id"];
        [self.viewOrderSummaryDictionary setObject: [self.viewSelectedItemsArray valueForKey:@"Quantity"] forKey: @"quantity"];

当我填充我的 UITableview 时,我会在浮点值处崩溃

NSDictionary* currentItem = [self.viewOrderSummaryArray objectAtIndex: indexPath.row];

cell.productNameLabel.text = [currentItem objectForKey: @"description"];
cell.productPriceLabel.text = [NSString stringWithFormat: @"%@%@ x %@",[currentItem objectForKey: @"currency"],[currentItem objectForKey: @"price"], [currentItem objectForKey: @"quantity"]]; // TODO: Must implement this later
[cell.productImageView sd_setImageWithURL:[currentItem objectForKey: @"imageUrlString"] placeholderImage:[UIImage imageNamed:@"appPlaceholderImage"]];

CALayer * l = [cell.productImageView layer];
[l setMasksToBounds:YES];
[l setCornerRadius:10.0];

float sumq = 0;
NSArray *array = [self.viewOrderSummaryArray valueForKey:@"price"];

for (NSNumber *num in array)
{

    sumq += [num floatValue];
}

float currentPrice = [[currentItem objectForKey: @"price"] floatValue];
float quantity = [[currentItem objectForKey: @"quantity"] intValue];
sumPrice += (currentPrice * quantity);

这就是我的 NSMutableArray 的样子:

    (
    {
    currency =         (
        R,
        R
    );
    description =         (
        MenuItem,
        MenuItem
    );
    id =         (
        3,
        2
    );
    imageUrlString =         (
        "http://www.ynet.co.il/PicServer2/24012010/2400206/1_wa.jpg",
        "http://photos-c.ak.fbcdn.net/hphotos-ak-prn2/t1.0-0/c1.0.959.639/s720x720/1509226_791526100861957_869094305_n.jpg"
    );
    price =         (
        "59.95",
        "59.95"
    );
    quantity =         (
        1,
        1
    );
}

这是崩溃日志:

2014-10-07 07:28:37.231 AppNinja[12824:1500013] -[__NSArrayI floatValue]: unrecognized selector sent to instance 0x7f98b0da73e0
 2014-10-07 07:28:37.233 AppNinja[12824:1500013] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI floatValue]: unrecognized selector sent to instance 0x7f98b0da73e0'
*** First throw call stack:
(
0   CoreFoundation                      0x00000001048a03f5 __exceptionPreprocess + 165
1   libobjc.A.dylib                     0x0000000104455bb7 objc_exception_throw + 45
2   CoreFoundation                      0x00000001048a750d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3   CoreFoundation                      0x00000001047ff7fc ___forwarding___ + 988
4   CoreFoundation                      0x00000001047ff398 _CF_forwarding_prep_0 + 120
5   DeliNinja                           0x0000000101921580 -[ViewOrderSummaryViewController tableView:cellForRowAtIndexPath:] + 2000
6   UIKit                               0x0000000102e09cd3 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 508
7   UIKit                               0x0000000102de97f1 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2846
8   UIKit                               0x0000000102dff65c -[UITableView layoutSubviews] + 213
9   UIKit                               0x0000000102d8c199 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 521
10  QuartzCore                          0x0000000102a5ff98 -[CALayer layoutSublayers] + 150
11  QuartzCore                          0x0000000102a54bbe _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
12  QuartzCore                          0x0000000102a54a2e _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
13  QuartzCore                          0x00000001029c2ade _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 242
14  QuartzCore                          0x00000001029c3bea _ZN2CA11Transaction6commitEv + 390
15  QuartzCore                          0x00000001029c4255 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 89
16  CoreFoundation                      0x00000001047d5347 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
17  CoreFoundation                      0x00000001047d52a0 __CFRunLoopDoObservers + 368
18  CoreFoundation                      0x00000001047cb0d3 __CFRunLoopRun + 1123
19  CoreFoundation                      0x00000001047caa06 CFRunLoopRunSpecific + 470
20  GraphicsServices                    0x00000001059a99f0 GSEventRunModal + 161
21  UIKit                               0x0000000102d13550 UIApplicationMain + 1282
22  DeliNinja                           0x00000001019b4a73 main + 115
23  libdyld.dylib                       0x00000001065f2145 start + 1
)

【问题讨论】:

  • 确保添加对象值(例如 NSString 或 NSNumber)。 setObject:需要id值
  • 崩溃日志中的错误消息和相关信息在哪里?
  • 你为什么使用 floatValue 而不是 doubleValue?一旦你的数字变大一点,你就会得到客户会抱怨的四舍五入错误。

标签: ios objective-c uitableview nsmutablearray nsmutabledictionary


【解决方案1】:

您在 NSArray 而不是 NSNumber 对象上调用 floatValue

验证:

for (NSNumber *num in array)
{
    NSLog(@"num is class %@", NSStringFromClass([num class]));
    sumq += [num floatValue];
}

【讨论】:

    【解决方案2】:

    我不是 100% 确定,但我认为您想要的是:

    for (NSDictionary *dict in self.viewOrderSummaryArray)
    {
        NSNumber* n = [val valueForKey:@"price"];
        sumq += [num floatValue];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多