2009-11-10 3 views
2

Dans Visual Basic, il y a une ligne de code que vous pouvez utiliser pour gérer les erreurs dans le codeGestion des erreurs dans Xcode, iPhone SDK

"On Error Resume Next" 

Y at-il quelque chose de similaire à Objective-C? Mon problème est que j'ai un bouton d'ajout "Ajouter une nouvelle cellule" qui crée une nouvelle cellule pendant l'exécution. Cependant, les cellules sont réorganisables. Lorsque vous essayez de réorganiser la cellule "Ajouter une nouvelle cellule", j'obtiens une erreur d'index hors limites. Si je peux juste corriger l'erreur, ce serait génial, mais s'il y a un gestionnaire d'erreur que je peux utiliser pour quitter la fonction de déplacement quand il y a une erreur, ce serait cool aussi.

Voici mon code moveRowAtIndexPath:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 
    iProfileAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    [appDelegate moveFromOriginal:fromIndexPath.row toNew:toIndexPath.row]; 
} 

Voici l'erreur que je reçois:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFArray objectAtIndex:]: index (7) beyond bounds (7)' 

Répondre

3

Vous pouvez utiliser try and catch. Ils sont comment c objectif, et d'autres, gérer les exceptions. Ils vont attraper "l'exception non interceptée" semblable à la façon dont je suppose que "On Resume Resume Next" fonctionne.

@try { 
    /*this is where the code that might throw an exception goes*/ 
    [appDelegate moveFromOriginal:fromIndexPath.row toNew:toIndexPath.row]; 
} 
@catch (NSException *exception) { 
    /*add something here if you want it to do something special when the exception(or "error") is thrown*/ 
} 
@finally { 
    /*you don't have to include this finally part but if you do the code in it is excecuted weather the exception is thrown or not*/ 
} 
+0

Cela a fonctionné parfaitement. Y a-t-il un moyen d'obtenir le "Ajouter une nouvelle cellule" pour revenir au tout dernier index s'il est déplacé vers un index inférieur? Mon but est d'avoir le "Ajouter une nouvelle cellule" toujours en bas de la table. Avec le code ci-dessus, il permet à la ligne "Ajouter une nouvelle cellule" de se déplacer n'importe où dans la table, et je ne le veux pas. – WrightsCS

+0

Vous ne devriez pas attraper l'exception. Vous devez empêcher le déplacement de la ligne "Ajouter une nouvelle cellule" en premier lieu. Vois ma réponse. – gerry3

+0

En fait, cette méthode fonctionne bien. Lorsque la modification de la table est terminée, l'option "Ajouter une nouvelle cellule" revient au dernier index et toute nouvelle ligne ajoutée est ajoutée à la fin de la table. Je peux me tromper avec la méthode de GERRY3, mais c'était juste une bosse dans la route qui m'avait BUG! – WrightsCS

1

Vous devriez lire this SO question à obtenir une trace de pile pour les exceptions lancées. Il vous permettra de déterminer exactement où l'exception est levée afin que vous puissiez la déboguer. This one pourrait également être utile. En outre, vous ne voulez pas simplement ignorer des erreurs comme celles-ci. L'exception est lancée pour une raison. Vous devriez répondre à cette raison.

5

Il s'agit d'une erreur de limite de tableau qui doit être corrigée.

Avez-vous essayé d'empêcher l'utilisateur de déplacer la cellule "Ajouter une nouvelle cellule"? Pour ce faire, implémentez tableView:canMoveRowAtIndexPath: et renvoyez NO pour la ligne de cellule "Ajouter une nouvelle cellule" (YES pour toutes les autres lignes).

+0

J'ai essayé cela, le problème est, les cellules sont créées dynamiquement, il y a donc des index supplémentaires. – WrightsCS

+2

Ceci est commun. Vous devriez garder une trace du nombre de lignes qu'il y a. Généralement, les lignes de données sont conservées dans un tableau et le nombre de lignes est [nombre_données] + 1 où 1 représente le nombre de lignes non-données telles qu'une ligne "Ajouter une nouvelle cellule". Dans tableView: canMoveRowAtIndexPath, vous pouvez vérifier si indexPath.row est [dataArray count] (index de la dernière ligne) et renvoyer NO pour cette ligne uniquement (donc elle ne peut pas être déplacée). – gerry3