代码之家  ›  专栏  ›  技术社区  ›  shrads

iPhone禁用uiActionSheet按钮

  •  8
  • shrads  · 技术社区  · 17 年前

    我想禁用ui操作表中的按钮,并在某个条件为真后启用它们。我怎样才能做到这一点?有什么想法吗?

    7 回复  |  直到 14 年前
        1
  •  8
  •   cidered    16 年前

    我发现克雷格的回答对我不起作用(在OS3.1上)。经过一番调查,我发现 UIActionSheet 实际上是 无证阶层 UIThreePartButton

    不管怎样,这对我很有用(作为 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];
                    }
                }
            }
        }
    }
    

    希望这对其他人有帮助,尽管我会重复埃德·马蒂的问题,即你是否最好干脆把这些按钮从行动表中删除,而不是这样做。与往常一样,如果苹果在未来的操作系统版本中再次修改这些api,那么在使用未经记录的特性时,会有被应用商店拒绝的风险,尽管这段代码编写得很优雅。

        2
  •  2
  •   Alex    17 年前

    在操作表打开时,是否有可能导致按钮启用的情况发生变化?如果没有,我认为更好的方法是根据您的条件更改工作表显示的按钮。

    否则,处理此问题的唯一方法是遍历工作表的子视图,如craig所说,并查找 UIButton 物体。不过,我会小心使用按钮的标题,因为标题可以(也应该!)为不同的语言本地化。所以与标题的比较并不是那么可靠。既然你没有创建按钮,你就不知道 tag 或 action 每一个按钮都是,所以这也有点困难。

    可能按钮会出现在 subviews 数组的顺序 UIActionSheet ,但由于没有文档记录,因此不能保证它们会按此顺序出现,或者在cocoa touch sdk的未来版本中继续按此顺序出现。正因为如此,我担心的主要是被应用商店拒绝使用未记录的功能。

        3
  •  1
  •   vaddieg    16 年前

    uiActionSheet不用于自定义。它应该显示实际的可用选项集。它不应该改变按钮在顶部的可用性。 只需删除未使用的按钮,或改用自定义视图

        4
  •  1
  •   mrapplehead    15 年前

    可能有点晚了。但是,我发现的方法是创建uibutton并添加它们 到uiActionSheet子视图。确保这些按钮放在顶部,并完全覆盖要替换的默认uiactionsheet按钮。当uiButton置于默认uiActionSheet按钮之上时,其uiResponder优先于uiActionSheet按钮uiResponder。因此,这样做,您可以禁用和启用这些按钮,不管您希望在uiviewcontroller逻辑中的任何位置。这可能是访问sdk私有方法(如上面的uithreepartbutton)的替代方法,苹果可能会拒绝您的应用程序。我相信这遵循了苹果的指导方针。

    即设置ui按钮,以便在某些情况发生后启用/禁用。

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

    注意:这在我以前构建的应用程序中非常有效。

        5
  •  0
  •   Shaikh Sonny Aman    17 年前

    如果将视图添加到操作表中,视图将不会收到任何事件。 您需要查看动作表的超级视图。

    请参见下面我如何添加带有修饰事件的按钮:

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

    }

        6
  •  0
  •   Mayoneez    15 年前

    当我有一个基于某些条件更改的操作表时,我也遇到了类似的问题。我完全忽略了行动表中不适用的选项,但在某些情况下,我最终得到的行动表只有一个选项。这看起来有点傻,因为我可以立即激活该选项,而根本不显示工作表。

    不过,我也希望用户了解到,单击屏幕上的某个按钮可以为他们提供一个可供选择的列表。这就是为什么我想在只有一个选项的情况下也显示动作表。我想禁用不适用的选项,而不是从表单中省略它们,但这也不太好。

    我的案例与在自定义底部栏中有一个用户图标有关,按该图标可显示以下选项:

    • 如果登录
      • 我的简介
      • 注销
    • 如果未登录
      • 登录
        7
  •  0
  •   richy    14 年前

    您可以在uiActionSheetDelegate中尝试[ActionSheet ValueForKey:@“\u Buttons”],如下所示:

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

    希望这不会在将来的sdk版本中改变。