iPhone禁用UIActionSheet按钮

shr*_*ads 8 iphone cocoa-touch objective-c uikit

我想禁用UIAction表中的按钮,并在某个条件成立后启用它们.我该如何实现这一目标?有任何想法吗?

cid*_*red 8

我发现克雷格的答案对我不起作用(在OS 3.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];
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助别人,虽然我会回应Ed Marty关于你是否会更好地从行动表中省略这些按钮而不是这样做的问题.与使用未记录的功能一样,存在应用程序存储拒绝的风险,尽管如果Apple在未来的操作系统版本中再次使用API​​,这些代码将被正常写入.

  • 永远不要使用`description`来比较类.正确的方法是使用`[view isKindOfClass:NSClassFromString(@"UIThreePartButton")];` (6认同)
  • 使用这样的未记录的类是在提交到App Store时被拒绝的可靠方法. (4认同)

Ale*_*lex 2

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

否则,处理此问题的唯一方法是迭代工作表的子视图,就像克雷格所说,并查找对象UIButton。不过,我会谨慎使用按钮的标题,因为标题可以(并且应该!)针对不同的语言进行本地化。因此,与标题的比较并不那么可靠。由于您没有创建按钮,因此您也不知道每个按钮的tagaction每个按钮是什么,所以这也有点困难。

据推测,这些按钮将subviews按照您在 中指定的顺序出现在数组中UIActionSheet,但由于这没有记录在案,因此无法保证它们会按该顺序出现,或者在将来的版本中将继续按该顺序出现Cocoa Touch SDK 的。正因为如此,我主要担心的是因为使用未记录的功能而被 App Store 拒绝。

  • 确实,它与私有 API 不同,但它是私有的,因为它基于实验,而不是文档。我强烈建议反对。我不确定苹果不会拒绝它——该协议让他们可以自由地以任何理由拒绝应用程序。 (2认同)