我想禁用UIAction表中的按钮,并在某个条件成立后启用它们。我该如何实现这一目标?有什么想法吗?
答案 0 :(得分: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];
}
}
}
}
}
希望能够帮助别人,尽管我会回应Ed Marty的问题,即你是否会更好地完全忽略行动表中的这些按钮,而不是这样做。与使用未记录的功能一样,存在应用程序存储拒绝的风险,尽管如果Apple在未来的操作系统版本中再次使用API,这些代码将被正常写入。
答案 1 :(得分:2)
当操作表打开时,是否存在可以更改的情况,这可能导致按钮变为启用状态?如果没有,我认为更好的方法是根据您的情况更改工作表显示的按钮。
否则,处理此问题的唯一方法是迭代工作表的子视图,如Craig所说,并查找UIButton
个对象。但是,我会小心使用按钮的标题,因为标题可以(并且应该!)针对不同语言进行本地化。因此,与标题的比较并非完全可靠。由于你没有创建按钮,你也不知道每个按钮的tag
或action
是什么,所以这也有点困难。
据推测,按钮将按照您为subviews
指定的顺序显示在UIActionSheet
数组中,但由于未记录,因此无法保证它们按此顺序显示,或者它们将继续以未来版本的Cocoa Touch SDK的顺序出现。因此,我主要担心因使用未记录的功能而被App Store拒绝。
答案 2 :(得分:1)
UIActionSheet不适用于自定义。它应显示实际可用选项集。它不应该在顶部更改按钮的可用性。 只需删除未使用的按钮,或使用自定义视图
答案 3 :(得分:1)
这可能有点晚了。但是,我想出的方法是创建UIButton并添加它们 到UIActionSheet子视图。确保这些按钮位于顶部并完全覆盖要更换的默认UIActionSheet按钮。当UIButton放在默认的UIActionSheet按钮上时,其UIResponder优先于UIActionSheet按钮UIResponder。因此,这样做可以禁用和启用这些按钮,但是你喜欢UIViewController逻辑中的任何地方。这可能是访问SDK的私有方法的替代方法(如上所述 - UIThreePartButton),苹果可能会拒绝您的应用。我相信这符合Apple的指导方针。
即。设置UIButtons以便在发生某些条件后启用/禁用。
// 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];
注意:这在我之前构建的应用程序中完美运行。
答案 4 :(得分:0)
如果将视图添加到操作表,则视图将不会收到任何事件。 您需要查看操作表的超级视图。
请参阅下文,我如何添加一个带有补足事件的按钮:
- (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];
}
答案 5 :(得分:0)
当我的行动表根据某些条件发生变化时,我遇到了类似的问题。我省略了完全不适用于操作表的选项,但在某些情况下,我最终得到的操作表只有一个选项。这看起来有点傻,因为我可以立即激活该选择而不显示表格。
但是,我还希望用户了解到点击屏幕上的某个按钮可以为他们提供他们可以选择的选项列表。这就是为什么我想在只有一个选择的情况下显示动作表。我想过要禁用不适用的选项,而不是从表单中省略它们,但这也感觉不对。
我的情况与在自定义底栏中设置用户图标并按下它会显示以下选项有关:
答案 6 :(得分:0)
您可以在UIActionSheetDelegate中尝试[actionSheet valueForKey:@" _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版本中不会改变。