在我的用户单击按钮后,我希望该按钮在执行网络操作期间保持推送状态 . 网络操作完成后,我希望按钮返回其默认状态 .
我尝试在按下按钮后调用-- [UIButton setSelected:YES]
(在我的网络操作完成后相应调用-- [UIButton setSelected:NO]
),但似乎没有做任何事情 . 如果我打电话给 setHighlighted:
也一样 .
我想我可以尝试交换背景图像,以表示网络操作期间的选定状态,但这似乎是一个黑客 . 有更好的建议吗?
这是我的代码的样子:
- (IBAction)checkInButtonPushed
{
self.checkInButton.enabled = NO;
self.checkInButton.selected = YES;
self.checkInButton.highlighted = YES;
[self.checkInActivityIndicatorView startAnimating];
[CheckInOperation startWithPlace:self.place delegate:self];
}
- (void)checkInCompletedWithNewFeedItem:(FeedItem*)newFeedItem wasNewPlace:(BOOL)newPlace possibleError:(NSError*)error;
{
[self.checkInActivityIndicatorView stopAnimating];
self.checkInButton.enabled = YES;
self.checkInButton.selected = NO;
self.checkInButton.highlighted = NO;
}
9 回答
如何为按钮上的不同
UIControlStates
设置图像?您是否为UIControlStateHighlighted
以及UIControlStateSelected
设置了背景图片?如果您在按钮触摸事件而不是在内部触摸上设置选定状态,则您的按钮实际上将处于突出显示的选定状态,因此您也需要设置该状态 .
编辑:
总结我在评论中的评论并解决您发布的代码...您需要为您所在的完整
UIControl
状态设置背景图像 . 根据您的代码片段,此控件状态将被禁用选中突出显示在网络运行期间 . 这意味着您需要这样做:如果你删除
highlighted = YES
,那么你需要这个:得到图片?
我有一个更简单的方法 . 只需使用带有0延迟的"performSelector"来执行
[button setHighlighted:YES]
. 这将在当前runloop结束后执行重新突出显示 .“打开电源后一切都会变得更好”
在将插座连接到Interface Builder中的按钮后,工作完美 .
您不需要setBackgroundImage:forState:,构建器允许您指定背景(必要时调整大小)或/和前景(不调整大小)图像 .
尝试使用NSOperationQueue来实现这一目标 . 尝试如下代码:
希望这可以帮助 .
使用块,这样您就不必构建一个完整的单独方法:
更新
为了清楚起见,你仍然需要为组合状态设置背景(或正常图像),以及在接受的答案中像sbrocket那样的常规状态 . 在某些时候,您的按钮将被选中并突出显示,除非您执行以下操作,否则您将无法获得该图像:
否则,您的按钮可以回退到UIControlStateNormal图像以获得短暂选择的突出显示状态,您将看到闪光灯 .
在swift中,我正如以下那样做 .
我创建一个
UIButton
的子类并实现了一个自定义属性state
适合我 .
我有一个类似的问题,我想要一个按钮,点击后保持它的高亮 . 问题是,如果您尝试在单击操作中使用
setHighlighted:YES
,它将在您单击操作后立即重置,- (IBAction)checkInButtonPushed
我通过使用像这样的NSTimer来解决这个问题
然后从我的
selectCurrentIndex
方法中调用setHighlighted:YES
. 我使用常规UIButtonTypeRoundedRect
按钮 .我有另一种方式...如果你不想使用图像,并且你想要按下按钮的效果,你可以继承按钮,这里是我的代码:
在.h文件中:
在.m文件中:
这是使用上述方法的C#/ MonoTouch(Xamarin.iOS)实现 . 它假定您已经设置了突出显示的图像状态,并配置选定和选中的突出显示状态以使用相同的图像 .