iPhone Disabling UIActionSheet buttons

后端 未结 7 872
梦谈多话
梦谈多话 2020-12-10 16:01

I want to disable buttons in the UIAction sheet and enable them after a certain condition is true. How do I achieve this? Any ideas?

相关标签:
7条回答
  • 2020-12-10 16:04

    Is there a circumstance that can change, while the action sheet is open, that could cause the button to become enabled? If not, I think the better approach is to alter the buttons that the sheet displays based on your condition.

    Otherwise, the only way of handling this is to iterate through the sheet's subviews, like Craig said, and look for the UIButton objects. I'd be careful about using the button's title, though, because the title could (and should!) be localized for different languages. So comparisons against the title aren't all that reliable. Since you didn't create the button, you don't really know what the tag or action of each button would be, either, so that's a bit difficult, too.

    Presumably, the buttons will appear in the subviews array in the order you specified them to the UIActionSheet, but since this isn't documented, there's no guarantee that they will appear in that order, or that they will continue to appear in that order in future releases of the Cocoa Touch SDK. Because of that, I'd worry mainly about being rejected from the App Store for using undocumented functionality.

    0 讨论(0)
  • 2020-12-10 16:07

    UIActionSheet is not intended for customizing. It should display actual set of available options. It should not change button's availability while on top. Just remove unused buttons, or use custom view instead

    0 讨论(0)
  • 2020-12-10 16:16

    If you add the view to the action sheet, the view wont receive any event. You need to the view to the superview of the action sheet.

    See below how i've added an button with touch up event:

    - (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];
    

    }

    0 讨论(0)
  • 2020-12-10 16:16

    You could try [actionSheet valueForKey:@"_buttons"] in your UIActionSheetDelegate like so:

    - (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];
        }
    }
    

    Hopefully this wont change in future releases of the sdk.

    0 讨论(0)
  • 2020-12-10 16:17

    This is probably a bit late. But, the way I figured out is create UIButton(s) and add them to UIActionSheet subview. Make certain these buttons are placed on top and completely cover the default UIActionSheet button(s) to replace. When the UIButton is placed over the default UIActionSheet button, its UIResponder takes precedence over UIActionSheet button UIResponder. So, doing so you can disable and enable those buttons however you'd like anywhere in you UIViewController logic. This may be an alternative to accessing private methods to the SDK (like above - UIThreePartButton) and apple might reject your app. I believe this follows the Apple guidelines.

    i.e. Setup UIButtons in order to enable / disable after certain conditions occur.

    // 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: This worked perfectly in a previous app I built.

    0 讨论(0)
  • 2020-12-10 16:19

    I found that craig's answer didn't work for me (on OS 3.1). After a little digging around I discovered that the subviews of UIActionSheet are actually of an undocumented class UIThreePartButton

    Anyway, this works for me (implemented as part of the UIActionSheetDelegete method)

    - (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];
                    }
                }
            }
        }
    }
    

    Hope that helps someone else, although I'd echo Ed Marty's question of whether you'd be better off just omitting these buttons from the action sheet altogether instead of doing this. As always when using undocumented features, there is a risk of app store rejection, although this code is written to fail gracefully if Apple do chnage the APIs again in a future OS release.

    0 讨论(0)
提交回复
热议问题