0

私のアプリケーションは、動的 xml フィードによって入力されるテーブルを使用しています。また、プルを使用して、Grant Paul によって記述されたコードを更新し、テーブルに新しいコンテンツがあればそれをリロードします。3 番目に、Apple の Reachability を使用して、テーブルをリロードするときにインターネット接続を判断しています。私の問題はこれです。インターネット接続でアプリケーションを開くと、アプリの実行中にインターネット接続が閉じられ、プルしてアプリケーションを更新するとクラッシュします。アプリが Reachable と NotReachable を切り替えているときに何かが発生しています。以下は私のコードです。アプリは Thread 6: signal SIGABRT on this line で失敗します: TFHppleElement *element = [elements objectAtIndex:0];

エラーコードは次のとおりです。

2012-10-02 14:00:03.715 FireCom[2229:1517] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'
*** First throw call stack:
(0x2d63012 0x21a0e7e 0x2d050b4 0x603f 0xd810d5 0xd81034 0x96213557 0x961fdcee)
libc++abi.dylib: terminate called throwing an exception
(lldb)

到達可能性コードは次のとおりです。

- (void)loadCallList
{
Reachability* reach = [Reachability reachabilityWithHostname:@"www.apple.com"];
NetworkStatus netStatus = [reach currentReachabilityStatus];

switch (netStatus)
{
    case NotReachable:
    {
        NSLog(@"Access Not Available");

        [pull finishedLoading];
        [self displayInternetMessage];

        break;
    }

    case ReachableViaWWAN:
    {
        NSLog(@"Reachable WWAN");

        // Parse HTML for random ID and create XML link

        NSURL *theURL = [NSURL URLWithString:@"http://www.wccca.com/PITS/"];
        NSData *data = [[NSData alloc] initWithContentsOfURL:theURL];
        xpathParser = [[TFHpple alloc] initWithHTMLData:data];
        NSArray *elements = [xpathParser searchWithXPathQuery:@"//input[@id='hidXMLID']//@value"];
        TFHppleElement *element = [elements objectAtIndex:0];
        TFHppleElement *child = [element.children objectAtIndex:0];
        NSString *idValue = [child content];

        NSString *idwithxml = [idValue stringByAppendingFormat:@".xml"];
        NSString *url = @"http://www.wccca.com/PITS/xml/fire_data_";
        NSString *finalurl = [url stringByAppendingString:idwithxml];

        xmlParser = [[XMLParser alloc] loadXMLByURL:finalurl];

        if (xmlParser.calls.count == 0)
        {
            self.headerHeight = 0.0;
            UIAlertView *noCalls = [[UIAlertView alloc] initWithTitle:@"No Current Calls"
                                                              message:@"There are no current 9-1-1 calls in Clackamas or Washington County."
                                                             delegate:self
                                                    cancelButtonTitle:@"OK"
                                                    otherButtonTitles:nil];

            [noCalls show];
            [noCalls release];
        }
        else
        {
            self.headerHeight = 45.0;
        }

        [callsTableView reloadData];
        [pull finishedLoading];

        break;
    }
    case ReachableViaWiFi:
    {
        NSLog(@"Reachable WiFi");

        // Parse HTML for random ID and create XML link

        NSURL *theURL = [NSURL URLWithString:@"http://www.wccca.com/PITS/"];
        NSData *data = [[NSData alloc] initWithContentsOfURL:theURL];
        xpathParser = [[TFHpple alloc] initWithHTMLData:data];
        NSArray *elements = [xpathParser searchWithXPathQuery:@"//input[@id='hidXMLID']//@value"];
        TFHppleElement *element = [elements objectAtIndex:0];
        TFHppleElement *child = [element.children objectAtIndex:0];
        NSString *idValue = [child content];

        NSString *idwithxml = [idValue stringByAppendingFormat:@".xml"];
        NSString *url = @"http://www.wccca.com/PITS/xml/fire_data_";
        NSString *finalurl = [url stringByAppendingString:idwithxml];

        xmlParser = [[XMLParser alloc] loadXMLByURL:finalurl];

        if (xmlParser.calls.count == 0)
        {
            self.headerHeight = 0.0;

            UIAlertView *noCalls = [[UIAlertView alloc] initWithTitle:@"No Current Calls"
                                                              message:@"There are no current 9-1-1 calls in Clackamas or Washington County."
                                                             delegate:self
                                                    cancelButtonTitle:@"OK"
                                                    otherButtonTitles:nil];

            [noCalls show];
            [noCalls release];
        }
        else
        {
            self.headerHeight = 45.0;
        }

        [callsTableView reloadData];
        [pull finishedLoading];

        break;
    }
}
}
4

1 に答える 1

1

私はあなたの問題を見ていると思います。

NSArray *elements = [xpathParser searchWithXPathQuery:@"//input[@id='hidXMLID']//@value"];
TFHppleElement *element = [elements objectAtIndex:0];
TFHppleElement *child = [element.children objectAtIndex:0];

elementsカウントが少なくとも 1 であると想定することはできません。


アップデート

たぶん、次のようなものを試してください

NSArray *elements = [xpathParser searchWithXPathQuery:@"//input[@id='hidXMLID']//@value"];
if (elements.count < 1) {
    // Any needed cleanup
    break;
}

TFHppleElement *element = [elements objectAtIndex:0];
TFHppleElement *child = [element.children objectAtIndex:0];

手っ取り早い方法として。

于 2012-10-02T21:07:53.430 に答える