试图附加转推的推文

时间:2015-08-20 19:44:12

标签: ios objective-c iphone twitter nsstring

我试图在Objective-C中追加转推的推文的字符串但是我总是遇到某些类型的推文的问题。我相信我试图将推文细分的方式有问题。我的代码如下所示

  2015-08-20 15:40:20.699 Floadt[21417:932559] *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString substringWithRange:]: Range {9223372036854775807, 52} out of bounds; string length 70'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010cd58c65 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010c631bb7 objc_exception_throw + 45
    2   CoreFoundation                      0x000000010cd58b9d +[NSException raise:format:] + 205
    3   CoreFoundation                      0x000000010cc7fb98 -[__NSCFString substringWithRange:] + 136
    4   Floadt                              0x000000010929efa4 -[TwitterTableViewController tableView:cellForRowAtIndexPath:] + 2260
    5   UIKit                               0x000000010b465a28 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 508
    6   UIKit                               0x000000010b444248 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2853
    7   UIKit                               0x000000010b45a8a9 -[UITableView layoutSubviews] + 210
    8   UIKit                               0x000000010b3e4a2b -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 536
    9   QuartzCore                          0x000000010b1a6ec2 -[CALayer layoutSublayers] + 146
    10  QuartzCore                          0x000000010b19b6d6 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
    11  QuartzCore                          0x000000010b19b546 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
    12  QuartzCore                          0x000000010b107886 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 242
    13  QuartzCore                          0x000000010b108a3a _ZN2CA11Transaction6commitEv + 462
    14  QuartzCore                          0x000000010b1090eb _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 89
    15  CoreFoundation                      0x000000010cc8bca7 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    16  CoreFoundation                      0x000000010cc8bc00 __CFRunLoopDoObservers + 368
    17  CoreFoundation                      0x000000010cc81a33 __CFRunLoopRun + 1123
    18  CoreFoundation                      0x000000010cc81366 CFRunLoopRunSpecific + 470
    19  GraphicsServices                    0x000000010eb09a3e GSEventRunModal + 161
    20  UIKit                               0x000000010b364900 UIApplicationMain + 1282
    21  Floadt                              0x000000010936574f main + 111
    22  libdyld.dylib                       0x000000010f32f145 start + 1
    23  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

以下是我追加字符串的代码:

if ([self Contains:@"RT" on:[data objectForKey:@"text"]]) {
    TwitterRetweetCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"TwitterRetweetCell"];
    cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"Background.png"]];
    if (cell == nil) {
        cell = [[TwitterRetweetCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TwitterRetweetCell"];
    }
    // Lookup RT User
    NSString *text = [data objectForKey:@"text"];

    NSRange start = [text rangeOfString:@"RT @"];
    NSRange end = [text rangeOfString:@":"];
    NSString *shortString = [text substringWithRange:NSMakeRange(start.location, end.location)];
    NSString *evenShorterString = [shortString substringFromIndex:4];

    [self lookupTwitterUser:evenShorterString];

    //Set username for twitter
    [cell.nameLabel setText:evenShorterString];

    //Set Retweet Status
    NSString *retName = [NSString stringWithFormat:@"Retweeted by %@",data[@"user"][@"screen_name"]];
    [cell.retweetedLabel setText:retName];


    //Set Profile Pic for Twitter
    return cell;
}

1 个答案:

答案 0 :(得分:0)

两个范围:

    NSRange start = [text rangeOfString:@"RT @"];
    NSRange end = [text rangeOfString:@":"];

您需要检查实际找到的子字符串,并且只有在找到它们时才使用范围。否则,其余代码将失败,因为范围的位置将是NSNotFound,这是崩溃日志中的大数字。这表明您的代码遇到了包含" RT"但不是" RT @"。在尝试使用开始和结束之前,您应该执行以下检查:

if (start.location != NSNotFound && end.location != NSNotFound)
{
    // use start and end
}

或者更好的是,使用if if条件代替if ([self Contains:@"RT" on:[data objectForKey:@"text"]])