2016-11-21 2 views
-4

ich initialisieren haben NSMutableArray in viewDidLoad wieIndex 1 über Grenzen für leere Array Fehler

playUrl = [[NSMutableArray alloc]init]; 

Aber wenn wir in cellForRowAtIndexPath verwenden

[playUrl insertObject:[NSString stringWithFormat:@"%@",_urlToLoad] atIndex:indexPath.row]; 

Dann wird es diesem Fehler

2016-11-21 18:06:14.481 TraidingWins[13917:238534] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM insertObject:atIndex:]: index 1 beyond bounds for empty array' 
*** First throw call stack: 
(
    0 CoreFoundation      0x0000000106348d85 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x0000000105dbcdeb objc_exception_throw + 48 
    2 CoreFoundation      0x0000000106209cc5 -[__NSArrayM insertObject:atIndex:] + 901 
    3 TraidingWins      0x0000000102dc7bd6 __45-[YouTubeVC tableView:cellForRowAtIndexPath:]_block_invoke_2 + 902 
    4 TraidingWins      0x0000000102dbb840 __58+[HCYoutubeParser h264videosWithYoutubeURL:completeBlock:]_block_invoke_2 + 48 
    5 libdispatch.dylib     0x000000010705fd9d _dispatch_call_block_and_release + 12 
    6 libdispatch.dylib     0x00000001070803eb _dispatch_client_callout + 8 
    7 libdispatch.dylib     0x00000001070681ef _dispatch_main_queue_callback_4CF + 1738 
    8 CoreFoundation      0x00000001062a20f9 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9 
    9 CoreFoundation      0x0000000106263b99 __CFRunLoopRun + 2073 
    10 CoreFoundation      0x00000001062630f8 CFRunLoopRunSpecific + 488 
    11 GraphicsServices     0x00000001087f5ad2 GSEventRunModal + 161 
    12 UIKit        0x0000000104435f09 UIApplicationMain + 171 
    13 TraidingWins      0x0000000102dcba8f main + 111 
    14 libdyld.dylib      0x00000001070b492d start + 1 
    15 ???         0x0000000000000001 0x0 + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
zeigen sein

Kann mir jemand helfen, die Probleme zu lösen ..

+1

Bitte überprüfen Sie Ihr Array ist leer, deshalb Absturz, Drucken Array, wo Sie Ihre playUrl –

+0

lesen Sie die Fehlermeldung, die Behebung des Fehlers ist im Grunde so einfach wie das. – luk2302

+0

nie Array einfügen und löschen Operation in CellForRowAtIndexPath immer folgen Sie den Best Practices –

Antwort

1

Fügen Sie Ihre statischen Daten direkt nach der Initialisierung in das Array ein. Wenn Sie UITableView-Methoden hinzufügen oder einfügen, erhalten Sie Abstürze. Tun Sie es so und überprüfen Sie die Antwort

-1

Ich denke, Sie tippen auf Second Object bedeutet objectAtInxex 1 so, Es gibt kein Objekt am 1. Index und Sie fügen Objekt direkt am 1. Index. Meiner Meinung nach, wenn Sie nur eine Liste von URL-Objekten hinzufügen oder ersetzen, können Sie addObject (addbojectAtIndex Specific index) verwenden. Lassen Sie mich auch wissen, wenn Sie etwas wissen möchten. Vielen Dank :)

+0

1) 'CellForRowAtIndexPath' hat nichts mit Tapping zu tun. 2) 'addObject' ist nicht gut genug, wenn Sie nach oben scrollen, werden urls nicht den Indizes entsprechen; 3) 'addbjectAtIndex' (korrekt ist 'insertObject: atIndex:') wird in der Frage verwendet. –

0

Es sind zwei mögliche Lösungen:

1. Sie können NSMutableDictionary verwenden.

Initialisierung:

playUrl = [[NSMutableDictionary alloc] init]; 

In cellForRowAtIndexPath:

playUrl[@(indexPath.row)] = [NSString stringWithFormat:@"%@", _urlToLoad]; 

2. Scheint, wie Ihr UITableView wird zunächst ein wenig verschoben. Also die erste Zelle, die es anfordert, ist 1. (nicht 0. wie erwartet). Wenn es 0 war, würde der Absturz weggehen.

Sie können ein Objekt nur an verfügbare Positionen in NSMutableArray einfügen. Wenn Ihr Array beispielsweise 3 Objekte enthält, können Sie in 0 ... 3 einfügen (einschließlich 0 und 3).

UPDATE

Jedes Mal, wenn Sie im Begriff sind, ein Objekt in das Array einzufügen, müssen Sie, wenn zu überprüfen, gibt es schon etwas auf dem Index. Wenn ein Objekt vorhanden ist, sollten Sie anstelle des Einfügens ersetzen (replaceObjectAtIndex:withObject:). Andernfalls wäre die Reihenfolge beschädigt.

Beispiel

sich ein Benutzer nach unten scrollt zu url3

@[ @"url1", @"url2", @"url3" ] // everything is fine 

scrollt dann nach oben. Und Tischanfragen url2 wieder.

@[ @"url1", @"url2", @"url2", @"url3" ] // second url2 and url3 occupy wrong positions 

Das Problem tritt auf, wenn Sie immer Objekte einfügen. Wenn Sie url2 durch url2 ersetzt haben, wäre alles in Ordnung, das Array würde sich nicht ändern.

Verwandte Themen