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. P>
merci p>
6 Réponses :
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
}
}
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.
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];
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
Grande solution, très simple, facile à utiliser et faite à la bonne voie d'ingénierie. +1
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
BTW, selon Ce , Le bouton Index DO I> 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.
Les solutions fournies ne fonctionnent pas sur iOS 8. Si quiconque n'utilise pas le (la deuxième phase est basée sur Ce donc réponse) P> 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: - (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--;
}
}
}
}
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)