... Il ya un doozy au chapitre 8, et je ne sais pas combien de temps il faudra pour que le correctif à faire son chemin dans le code source sur le site officiel du livre. Le problème est assez facile à corriger, mais, alors j'ai pensé que je devais poster ici jusqu'à ce que le correctif est dans le code source officielle.
Si vous avez essayé de compiler le projet de chapitre 8 cellules et sont la compilation contre le SDK 2.1 ou 2.2 SDK, alors votre programme est susceptible s'écraser avec un NSRangeException. Voici ce qui se passe.
Sous SDK 2.0, la méthode NSBundle loadNibNamed: le propriétaire: options: a retourné un tableau qui avait, comme son premier objet, un objet proxy à l'index 0. Je crois que cet objet proxy points à Fichier de propriétaire, Mais je ne suis pas sûr de cela, et si quelqu'un sait mieux, s'il vous plaît faites le moi savoir. Quoi qu'il en points, l'existence de cet objet proxy signifiait que la première instance de la plume serait situé à l'index 1, alors quand nous avons attrapé la vue dans la tableView: cellForRowAtIndexPath: méthode dans le livre, nous avons saisi l'objet à l'index 1 , qui est le premier (et seul dans notre cas) par exemple dans la plume.
Avec le SDK 2.1 +, le comportement a été modifié de sorte qu'aucun objet proxy est inclus dans le tableau. En conséquence, l'indice de la première instance de la plume devient maintenant 0 au lieu de 1. Depuis notre plume eu qu'un seul cas (hors sous-vues), le tableau n'avait qu'un seul objet, ce qui signifie que l'index 1 est désormais hors de portée. La solution, c'est facile - il suffit de changer
Voici la méthode complète, en utilisant les macros de disponibilité afin de s'assurer qu'il compile correctement sous toutes les versions actuelles du SDK:
Si vous avez essayé de compiler le projet de chapitre 8 cellules et sont la compilation contre le SDK 2.1 ou 2.2 SDK, alors votre programme est susceptible s'écraser avec un NSRangeException. Voici ce qui se passe.
Sous SDK 2.0, la méthode NSBundle loadNibNamed: le propriétaire: options: a retourné un tableau qui avait, comme son premier objet, un objet proxy à l'index 0. Je crois que cet objet proxy points à Fichier de propriétaire, Mais je ne suis pas sûr de cela, et si quelqu'un sait mieux, s'il vous plaît faites le moi savoir. Quoi qu'il en points, l'existence de cet objet proxy signifiait que la première instance de la plume serait situé à l'index 1, alors quand nous avons attrapé la vue dans la tableView: cellForRowAtIndexPath: méthode dans le livre, nous avons saisi l'objet à l'index 1 , qui est le premier (et seul dans notre cas) par exemple dans la plume.
Avec le SDK 2.1 +, le comportement a été modifié de sorte qu'aucun objet proxy est inclus dans le tableau. En conséquence, l'indice de la première instance de la plume devient maintenant 0 au lieu de 1. Depuis notre plume eu qu'un seul cas (hors sous-vues), le tableau n'avait qu'un seul objet, ce qui signifie que l'index 1 est désormais hors de portée. La solution, c'est facile - il suffit de changer
cell = (CustomCell *)[nib objectAtIndex:1];to
cell = (CustomCell *)[nib objectAtIndex:0];
Voici la méthode complète, en utilisant les macros de disponibilité afin de s'assurer qu'il compile correctement sous toutes les versions actuelles du SDK:
Aussi, si vous compilez le code à partir de l'archive du projet contre le SDK 2.0, vous pouvez rencontrer un message d'avertissement comme ceci:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CustomCellIdentifier = @"CustomCellIdentifier ";
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCellView"
owner:self options:nil];
// The behavior here changed between SDK 2.0 and 2.1. In 2.1+, loadNibNamed:owner:options: does not
// include an entry in the array for File's Owner. In 2.0, it does. This means that if you're on
// 2.2 or 2.1, you have to grab the object at index 0, but if you're running against SDK 2.0, you
// have to grab the object at index:0.
// You might be tempted to use UIDevice to get the system version number, however that is the
// operating system version, not the version of the SDK that the application is linked against. An
// iPhone operating running iPhone OS 2.2 can, for example, run an application linked against the
// 2.0 vesion of the SDK
// The way to handle this is to use what are called "Availability Macros". The pre-compiler macro
// __IPHONE_2_1 will be defined for SDK 2.1 and later, but not on SDK 2.0
#ifdef __IPHONE_2_1
cell = (CustomCell *)[nib objectAtIndex:0];
#else
cell = (CustomCell *)[nib objectAtIndex:1];
#endif
}
NSUInteger row = [indexPath row];
NSDictionary *rowData = [self.computers objectAtIndex:row];
cell.colorLabel.text = [rowData objectForKey:@"Color"];
cell.nameLabel.text = [rowData objectForKey:@"Name"];
return cell;
}
iPhone DevelopmentNe pas s'inquiéter à ce sujet - tout ce qu'il signifie, c'est que la plume a été ouvert dans Interface Builder sur une machine avec le SDK 2.1 + installé, et il a ajouté un attribut qui n'est pas utilisé dans le SDK 2.0. Cet attribut sera tout simplement ignoré lorsqu'il est compilé avec le SDK 2.0.
Projects/08 Cells/CellsViewController.xib:6: warning: UIScrollView's 'Bounce
Zoom' option will be ignored on iPhone OS versions prior to 2.1.
Aucun commentaire:
Enregistrer un commentaire