9
votes

Comment désactiver le bouton dans UIacerSheet?

J'ai besoin de désactiver les boutons de la fiche uactionnelle. Après quelques opérations, j'ai besoin de les activer à nouveau. Alors y a-t-il un moyen de faire cela.

merci


0 commentaires

6 Réponses :


-2
votes

Les boutons Thees sont des sous-espages de la fiche uactronique et de leur classe est Uithreepartbutton

Vous pouvez les obtenir et faire tout ce que vous souhaitez: P>

UIActionSheet *a = [[UIActionSheet alloc]initWithTitle:@"" delegate: nil cancelButtonTitle: @"c" destructiveButtonTitle: @"d" otherButtonTitles: @"ot", nil];
    [a showInView: window];

    for(UIView *v in [a subviews])
    {
        if([[v description] hasPrefix: @"<UIThreePartButton"] )
        {
            v.hidden = YES;  //hide
           //((UIButton*)v).enabled = NO;   // disable

        }
    }


3 commentaires

Je suggérerais que vous n'utilisez pas cette méthode car ils sont privés pour le SDK. Apple pourrait rejeter votre application. La meilleure alternative serait de ne pas montrer ces boutons au lieu de les désactiver


Il n'y a pas de méthodes privées dans ce code)) seulement du public :) Parfois, j'utilise des méthodes privées dans mes applications. Je les utilise une fois deux fois dans l'application et Apple n'a pas rejeté ces applications


Il ne s'agit pas simplement d'être rejeté par Apple, l'utilisation de l'API privée montre un manque de respect pour vos clients. Les API privées sont privées car Apple les verrouille toujours, donc si et quand ils changent, votre demande se cassera. Afficher la traversée comme que vous avez décrite ci-dessus a provoqué un certain nombre d'applications à la casser sous 3,0, tant que Apple a également appelé celui-ci dans les notes de libération et a déclaré ne pas le faire.



0
votes

Ceci est probablement un peu en retard. Mais, la façon dont j'ai pensé, est de créer Uibutton (s) et ajoutez-les à la sous-évaluation Uactionheet. Assurez-vous que ces boutons sont placés sur le dessus et couvrent complètement la ou les touches d'utilisation par défaut pour remplacer. Lorsque l'uibutton est placé sur le bouton UIAGEHEET par défaut, son uiresponder a priorité sur le bouton UIacerSheet Bouton UIREPONDER. Donc, ce faisant, vous pouvez désactiver et activer ces boutons, mais vous souhaitez n'importe où dans votre logique UIViewController. Cela peut être une alternative à l'accès à des méthodes privées au SDK (comme ci-dessus - UithreePartbutton) et Apple pourrait rejeter votre application. Je crois que cela suit les lignes directrices Apple.

I.E. P>

// Instantiate once
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];


0 commentaires

17
votes

Basé sur un certain nombre de threads, j'ai annoncé une réponse dans une catégorie de l'uacéheet, ajout d'un setButton: méthode de toste comme suit. J'espère que cela aide:

@interface UIActionSheet(ButtonState)
- (void)setButton:(NSInteger)buttonIndex toState:(BOOL)enbaled;
@end

@implementation UIActionSheet(ButtonState)
- (void)setButton:(NSInteger)buttonIndex toState:(BOOL)enabled {
    for (UIView* view in self.subviews)
    {
        if ([view isKindOfClass:[UIButton class]])
        {
            if (buttonIndex == 0) {
                if ([view respondsToSelector:@selector(setEnabled:)])
                {
                    UIButton* button = (UIButton*)view;
                    button.enabled = enabled;
                }
            }
            buttonIndex--;
        }
    }
}
@end


1 commentaires

Grande solution, très simple, facile à utiliser et faite à la bonne voie d'ingénierie. +1



2
votes

Version légèrement améliorée de [hélas je ne peux pas ajouter un commentaire à sa raison que je n'ai pas encore la «réputation» ...].

@interface UIActionSheet (ButtonEnabled)
- (void)setButtonAtIndex:(NSUInteger)index Enabled:(BOOL)enabled;
@end

@implementation UIActionSheet (ButtonEnabled)
- (void)setButtonAtIndex:(NSUInteger)index Enabled:(BOOL)enabled
{
    for (UIView* view in self.subviews) {
        if ([view isKindOfClass:[UIButton class]]) {
            if (index-- == 0) {
                [(UIButton*)view setEnabled:enabled];
                break;
            }
        }
    }
}
@end


1 commentaires

BTW, selon Ce , Le bouton Index DO GO HAYWIRE Lorsque vous avez trop d'articles dans votre feuille d'action. Donc, cela va bousiller cette approche (pour désactiver) si vous avez à plusieurs.



1
votes

Les solutions fournies ne fonctionnent pas sur iOS 8. Si quiconque n'utilise pas le uialertController code> pour ceci (qui est le moyen recommandé d'Apple de le faire) Voici comment j'ai modifié la réponse de @ Reuven au travail Pour iOS 8 aussi:

(la deuxième phase est basée sur Ce donc réponse) P>

- (void)setButton:(NSInteger)buttonIndex toState:(BOOL)enabled {

    SEL selector = NSSelectorFromString(@"_alertController");

    //iOS 8
    if ([self respondsToSelector:selector]) {

        UIAlertController *alertController = [self valueForKey:@"_alertController"];

        if ([alertController isKindOfClass:[UIAlertController class]]){

            UIAlertAction *action = alertController.actions[buttonIndex];

            [action setEnabled:enabled];

        }

    //iOS 7
    }else{

        for (UIView* view in self.subviews){

            if ([view isMemberOfClass:NSClassFromString(@"UIAlertButton")]) {

                if (buttonIndex == 0) {

                    if ([view respondsToSelector:@selector(setEnabled:)]){

                        UIButton* button = (UIButton*)view;

                        button.enabled = enabled;

                    }

                }

                buttonIndex--;

            }

        }

    }

}


0 commentaires

3
votes

SWIFT 3.0 Version: strong>

let actionSheet = UIAlertController(title:nil, message:nil, preferredStyle:UIAlertControllerStyle.actionSheet)


actionSheet.addAction(UIAlertAction(title:"Modify", style:UIAlertActionStyle.default, handler:{ action in
    // Do your thing here
}))

let disabledDelete = UIAlertAction(title:"Cannot delete this item", style:UIAlertActionStyle.destructive, handler:nil)
disabledDelete.isEnabled = false
actionSheet.addAction(disabledDelete)

actionSheet.addAction(UIAlertAction(title:"Cancel", style:UIAlertActionStyle.cancel, handler:nil))

self.present(actionSheet, animated:true, completion:nil)


0 commentaires