tableView didSelectRowAtIndexPath ne fonctionne pas correctement sur iOS 7. Pourquoi?
En premier lieu, je voudrais dire que je suis le seul à faire cette question, parce que je voudrais comprendre ce qui se passe.
J'ai ouvert un vieux projet Xcode (très simple) dans une nouvelle installation sur Xcode5.
Quand je me rends compte que cela ne fonctionne pas sur iOS 7. Pourquoi? Ne sais pas..
J'ai vu quelques autres questions, n'obtenez pas une réponse utile, j'ai donc fait un test simple.
Dans le UITableViewController
tous fonctionne bien sauf sur didSelectRowAtIndexPath
Vérifier
RootViewController.h:
@interface RootViewController : UITableViewController
@property (strong, nonatomic) NSMutableArray *items;
@end
RootViewController.m
Dans le viewDidLoad je initialisation de la matrice (avec des chaînes).
Mettre en œuvre la source de données et de déléguer des méthodes (et oui j'ai mis le délégué et la source de données à la tableView)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [_items count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
//Configure the cell...
cell.textLabel.text = [_items objectAtIndex:indexPath.row];
return cell;
}
Le problème est ici:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Navigation logic may go here, for example:
//Create the next view controller.
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
//Push the view controller.
[self.navigationController pushViewController:detailViewController animated:NO];
detailViewController.detailLabel.text = [_items objectAtIndex:indexPath.row];
}
DetailViewController
est un simple UIViewController:
(oui, j'ai mis le IBOutlet sur fichier nib)
@interface DetailViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *detailLabel;
@end
Le problème est que cela ne fonctionne pas sur iOS7, l'étiquette dans DetailViewController
n'est pas mis à jour. J'ai essayer de mettre le texte de l'étiquette avant et l'après de pushViewController
.
Cela fonctionne sur toutes les versions précédentes d'iOS.
Pourquoi ne fonctionne pas sur iOS 7 ??
La seule manière pour moi de ce travail est, comme je l'ai vu sur cette autre question:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Navigation logic may go here, for example:
//Create the next view controller.
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
//Push the view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
dispatch_async(dispatch_get_main_queue(), ^{
detailViewController.detailLabel.text = [_items objectAtIndex:indexPath.row];
});
}
Quelqu'un peut-il m'aider à comprendre ce qui se passe ici??
Merci!
_
MODIFIER
elle fonctionne comme ceci:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Navigation logic may go here, for example:
//Create the next view controller.
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
//Push the view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
if (detailViewController.view) {
//do notihing
}
detailViewController.detailLabel.text = [_items objectAtIndex:indexPath.row];
}
oui, elle est appelée..
vous travaillez sur une application iPhone?
Malheureusement, ne peut pas le tester sur l'appareil avec iOS 7, je n'ai pas du tout avec elle en ce moment. Mais j'ai dit qu'il travaille sur une version précédente d'iOS 6.1.
ok la question est tout pour aujourd'hui est a été pour iphone ou ipad
OriginalL'auteur Frade | 2013-10-11
Vous devez vous connecter pour publier un commentaire.
À la fois lorsque vous définissez la valeur de la UILabel, la vue n'a pas encore été chargé, donc si vous cochez la case débogage, vous trouverez probablement detailLabel est nul.
Pourquoi ne pas passer la valeur à une coutume méthode init? par exemple,
Puis dans le viewDidLoad, affectez la valeur?
Selon votre montage, en réponse à votre question de savoir pourquoi cela fonctionne:
J'ai fait la maquette de votre scénario, si vous avez accès à une vue sur un ViewController, il va appeler viewDidLoad si la vue n'existe pas. Si votre UILabel devient maintenant ensemble. Voici la sortie de la console.
Je recommande d'utiliser un custom méthode init, plutôt que cette approche - ce l'exemple ci-dessus est un hack. Utiliser quelque chose comme E. g.
Si vous ne souhaitez pas utiliser un custom initialiser, je suggère un public bien sur votre DetailViewController de type NSString. Attribuer qu'à l'aide de votre approche après init est appelée. Puis, à l'intérieur DetailViewController, dans le viewDidLoad, ou apparaît, définissez la IBOutlet à la valeur de la propriété contenant la NSString.
initWithNibName:bundle:
pour créer le DetailViewController. Donc, lorsqu'il est (primaire) sera accessible, le point de vue de la hiérarchie sera chargé et configuré selon la plume de fichier. Cela devrait également invoquerviewDidLoad
pour la DetailViewController. Il serait intéressant de vérifier siviewDidLoad
sera appelée. Et pour les tests, un énoncé commeUIView* view= detailViewController.view;
peut être inséré à confirmer l'affirmation ci-dessus. Aussi, vérifiez auprès deisViewLoaded
.Jeff est correct. Dans le code d'origine, l'étiquette de la propriété est accessible long avant le point de vue du contrôleur de vue est chargé.
OK, ce serait
detailViewController.view;
une bonne solution pour forcer l'affichage de la charge? Apparaît hackish. Est-il une meilleure idée?Passer la valeur en paramètre lors de l'initialisation, ou de l'utilisation d'un retour d'appel pour le contrôleur de parent pour la valeur. Ou une source de données partagée qui peut être mis à jour, de sorte que le nouveau-vue-contrôleur d'accès. Ou définir une variable d'instance sur le detailViewController, puis dans le viewDidLoad, mise à jour de la IBOutlet
La mienne, est l'approche utilisée dans apple modèle pour UITableViewController. Il devrait fonctionner. Il fonctionne pour toutes les précédentes d'iOS. N'est pas stupide d'avoir à utiliser une solution de contournement!?
OriginalL'auteur Tim
Ses pas à obtenir des mises à jour parce que vous êtes à faire de l'écriture
@property (faible, nonatomic) IBOutlet UILabel *detailLabel;
Vous faites la UILabel que la faiblesse de la propriété. Vous devez vous rendre fort bien.
@property (forte, nonatomic) IBOutlet UILabel *detailLabel;
Comme vous faites votre propriété faible, de sorte que son détruites.
Pour en savoir plus à propos de faible et de forte possédants vous pouvez vous référer
Les différences entre les forts et les faibles en Objective-C
OriginalL'auteur tania_S