2009-04-13 6 views
8

Je souhaite désactiver les boutons de la feuille UIAction et les activer après qu'une certaine condition soit vraie. Comment puis-je y parvenir? Des idées?iPhone Désactivation des boutons UIActionSheet

+4

Je sais qu'il est difficile de changer d'avis, mais êtes-vous sûr de vouloir vraiment faire ça? Peut-être que vous voulez juste montrer la feuille d'action sans les boutons qui sont désactivés, et quand certaines conditions sont vraies, montrer l'autre à la place (cacher l'autre si nécessaire) –

+0

Voir une autre réponse Je regroupe de nombreuses sources dans cette réponse ] (http://stackoverflow.com/a/9380142/100017) – Reuven

Répondre

2

Y at-il une circonstance qui peut changer, alors que la feuille d'action est ouverte, qui pourrait provoquer l'activation du bouton? Sinon, je pense que la meilleure approche consiste à modifier les boutons que la feuille affiche en fonction de votre état. Sinon, la seule façon de gérer cela est de parcourir les sous-vues de la feuille, comme Craig l'a dit, et de rechercher les objets UIButton. Je ferais attention à utiliser le titre du bouton, car le titre pourrait (et devrait!) Être localisé pour différentes langues. Les comparaisons avec le titre ne sont donc pas si fiables. Puisque vous n'avez pas créé le bouton, vous ne savez pas vraiment ce que serait le tag ou action de chaque bouton, donc c'est un peu difficile aussi. Vraisemblablement, les boutons apparaîtront dans le tableau subviews dans l'ordre que vous les avez spécifié au UIActionSheet, mais puisque cela n'est pas documenté, il n'y a aucune garantie qu'ils apparaîtront dans cet ordre, ou qu'ils continueront à apparaître dans cet ordre dans les futures versions du Cocoa Touch SDK. À cause de cela, je m'inquiéterais surtout d'être rejeté de l'App Store pour avoir utilisé des fonctionnalités non documentées.

+0

Vous ne serez pas rejeté de l'App Store pour cette procédure. Il y a toujours une chance qu'Apple change l'ordre de la sous-vue, et votre application peut commencer à agir bizarrement, mais ce n'est pas le type de 'foncionalité non documentée' qu'ils interdiraient du magasin. –

+2

Certes, ce n'est pas la même chose qu'une API privée, mais elle est privée dans le sens où elle est basée sur l'expérience, pas sur la documentation. Je recommande très fortement contre. Je ne suis pas convaincu que Apple ne le rejetterait pas - l'accord leur donne carte blanche dans le rejet d'applications pour une raison quelconque. – Alex

0

Si vous ajoutez la vue à la feuille d'action, la vue ne recevra aucun événement. Vous devez accéder à la vue de la feuille d'action.

Voir ci-dessous comment j'ai ajouté un bouton avec l'événement tactile jusqu'à:

- (void)didPresentActionSheet:(UIActionSheet *)actionSheet{ 
CGRect rect = CGRectMake(0,0, 320, 480); 
UIButton* anImage = [[UIButton alloc] init]; 
[anImage setTitle:@"GHello worl" forState:UIControlStateNormal]; 
[anImage setTitle:@"GHello worl dfasd" forState:UIControlStateHighlighted]; 
[anImage setTitle:@"GHello worl selected" forState:UIControlStateSelected]; 
//[anImage setBackgroundImage:[UIImage imageNamed:@"photo.png"] forState:UIControlStateNormal]; 
[anImage addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
rect = CGRectMake(0,0, 320, 220); 
anImage.frame =rect; 


[actionSheet.superview addSubview:anImage]; 



[anImage release]; 

}

8

Je trouve que la réponse de craig ne fonctionne pas pour moi (sur OS 3.1). Après un peu de creuser autour j'ai découvert que les sous-vues de UIActionSheet sont en fait d'une classe non documentée UIThreePartButton

Quoi qu'il en soit, cela fonctionne pour moi (mis en œuvre dans le cadre de la méthode UIActionSheetDelegete)

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet // before animation and showing view 
{ 
    for (UIView* view in [actionSheet subviews]) 
    { 
     if ([[[view class] description] isEqualToString:@"UIThreePartButton"]) 
     { 
      if ([view respondsToSelector:@selector(title)]) 
      { 
       NSString* title = [view performSelector:@selector(title)]; 
       if ([title isEqualToString:@"Button 1"] && [view respondsToSelector:@selector(setEnabled:)]) 
       { 
        [view performSelector:@selector(setEnabled:) withObject:NO]; 
       } 
      } 
     } 
    } 
} 

Espoir qui aide quelqu'un d'autre, bien que je fasse écho à la question d'Ed Marty de savoir si vous feriez mieux d'omettre ces boutons de la feuille d'action au lieu de le faire. Comme toujours lors de l'utilisation de fonctionnalités non documentées, il existe un risque de rejet du magasin d'applications, bien que ce code soit écrit pour échouer correctement si Apple réécoute les API dans une future version du système d'exploitation.

+6

N'utilisez jamais 'description' pour comparer des classes. La manière correcte est d'utiliser use [view isKindOfClass: NSClassFromString (@ "UIThreePartButton")]; ' – Kornel

+4

Utiliser des classes non documentées comme ceci est un moyen sûr d'être rejeté lors de la soumission à l'App Store. – PeyloW

1

UIActionSheet n'est pas destiné à la personnalisation. Il devrait afficher l'ensemble réel des options disponibles. Il ne devrait pas changer la disponibilité du bouton en haut. Il suffit de supprimer les boutons inutilisés, ou utiliser la vue personnalisée à la place

0

J'ai rencontré un problème similaire lorsque j'avais une feuille d'action qui change en fonction de certaines conditions. J'ai omis les choix qui ne sont pas applicables à partir de la feuille d'action, mais dans certains cas, je me retrouve avec une feuille d'action avec un seul choix. Cela semble un peu stupide, puisque je pourrais activer ce choix immédiat sans afficher la feuille du tout.

Cependant, je veux également que les utilisateurs apprennent que cliquer sur un bouton donné à l'écran leur donne une liste de choix parmi lesquels ils peuvent choisir. C'est pourquoi je veux afficher la feuille d'action également dans les cas où elle n'a qu'un choix.J'ai pensé à désactiver les choix non-applicables au lieu de les omettre de la feuille, mais cela ne me paraissait pas bien non plus.

Mon cas est lié à avoir une icône d'utilisateur dans une barre inférieure personnalisée et en appuyant sur elle présente les choix suivants:

  • si connecté
    • Mon profil
    • Déconnexion
  • sinon connecté
    • Connexion
1

Ceci est probablement un peu en retard. Mais, la façon dont j'ai compris est de créer UIButton (s) et les ajouter à la sous-vue UIActionSheet. Assurez-vous que ces boutons sont placés sur le dessus et recouvrez complètement le (s) bouton (s) UIActionSheet par défaut à remplacer. Lorsque UIButton est placé sur le bouton UIActionSheet par défaut, son UIResponder est prioritaire sur le bouton UIActionSheet UIResponder. Donc, ce faisant, vous pouvez désactiver et activer ces boutons comme vous le souhaitez n'importe où dans votre logique UIViewController. Cela peut être une alternative à l'accès aux méthodes privées au SDK (comme ci-dessus - UIThreePartButton) et Apple pourrait rejeter votre application. Je crois que cela suit les lignes directrices d'Apple.

Par exemple, configurez les UIButtons pour activer/désactiver après l'apparition de certaines conditions.

// Instantiate once within a method 
if (self.actionSheet==nil) { 
    UIActionSheet *as = [[UIActionSheet alloc] 
         initWithTitle:@"" 
         delegate:self 
         cancelButtonTitle:@"Cancel" 
         destructiveButtonTitle:@"Load Data" 
         otherButtonTitles:@"Update Data",nil]; 

    //[actionSheet showInView:self.view]; 
    self.loadUIButton.frame = CGRectMake(24.0f,25.0f,275.f,46.0f); 
    [as addSubview: self.loadUIButton]; 
    self.updateUIButton.frame = CGRectMake(24.0f,78.0f,275.f,46.0f); 
    [as addSubview: self.updateUIButton]; 
    //[actionSheet addSubview: self.cancelUIButton]; 
    //[as showFromToolbar: self.navigationController.toolbar]; 
    self.actionSheet = as; 
    [as release]; 
} 
[self.actionSheet showFromToolbar: self.navigationController.toolbar]; 

NOTE: Cela a fonctionné parfaitement dans une application précédente que j'ai construite.

0

Vous pouvez essayer [actionSheet valueForKey: @ "_ boutons"] dans votre UIActionSheetDelegate comme ceci:

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet 
{ 
    for (UIButton *btn in [actionSheet valueForKey:@"_buttons"]) 
    { 
     [btn setBackgroundImage:[UIImage imageNamed:@"btnActionSheetUp.png"]  forState:UIControlStateNormal]; 
     [btn setBackgroundImage:[UIImage imageNamed:@"btnActionSheetDown.png"] forState:UIControlStateHighlighted]; 
    } 
} 

Espérons que ce changement wont dans les versions ultérieures du sdk.

+0

Est-ce que cela va être rejeté? Dans le cas où vous avez beaucoup de boutons, UIActionSheet va définir un défilement avec les boutons, et puis, cela ne fonctionne pas, savez-vous comment le résoudre? Merci! – Oscar

Questions connexes