gpt4 book ai didi

objective-c - 如何从 UISwitch 中删除目标,以避免因快速点击开关而产生的问题?

转载 作者:行者123 更新时间:2023-11-29 11:08:30 24 4
gpt4 key购买 nike

我该怎么办?

我有一个 UISwitch。当用户点击开关时,惊人的事情发生了!

现在,如果用户双击开关,我会发生惊人的崩溃!因为第一次点击仍然在做惊人的事情!

我想做的是这个,

用户点击:

1 - 调用了 toggleOvertimeSwitch

2 - 从开关中移除目标(为了避免在发生双击时被调用)

3 - 做令人惊奇的事情

4 - 再次添加目标

虽然稍后需要注意 Switch 的位置,但乍一看,这应该可行。但事实并非如此。

我正在将自己作为目标移除,但它仍然会继续响应所有的点击! toggleOvertimeSwith 总是被调用。我不明白为什么。

谁能帮我解决这个问题?

谢谢!

努诺

代码:

我的 viewDidLoad 实现了这个,

[self.toggleSwitch addTarget:self
action:@selector(toggleOvertimeSwitch:)
forControlEvents:UIControlEventValueChanged];

我的 toggleOvertimeSwitch 实现了这一点,

-(void)toggleOvertimeSwitch:(UISwitch *)sender
{

[self.toggleSwitch removeTarget:self
action:@selector(toggleOvertimeSwitch:)
forControlEvents:UIControlEventValueChanged];

// Do something amazing here


[self.toggleSwitch addTarget:self
action:@selector(toggleOvertimeSwitch:)
forControlEvents:UIControlEventValueChanged];

}

最佳答案

  • 如果您提到“做一些令人惊奇的事情”的部分与您的其余代码在同一个线程/队列中执行,它不会改变任何东西,因为每个事件/使用操作都在主线程中处理,因此,从 toggleOvertimeSwitch: 的开始到结束,在方法本身完成之前,不会有任何中断或由任何用户操作触发的此方法的任何其他调用。

  • 如果您的“令人惊奇的事情”代码是在单独的线程中执行的,例如使用 GCD dispatch_async 函数,那么禁用您的 switch 操作是有意义的,但是:

    • 你应该等待你的“惊人的工作”完成,然后再重新激活你的开关 Action ,就好像你真的在那里做了一些异步的事情,重新添加你的目标/ Action 的代码将被执行,而无需等待异步代码完成,根据定义,您的开关将在操作完成之前重新启用
  • 而且,您仍然应该使用开关的 enabled 属性来禁用和重新启用它,而不是删除并重新添加目标/操作,这样会容易得多!

我不知道你是否真的使用 GCD 或一些线程代码或其他任何东西来做你的“惊人的工作”,因为你没有在你的问题中提供太多信息,所以我只是完全猜测,但例如,如果你使用 dispatch_async,它会给出这样的东西:

-(IBAction)toggleOvertimeSwitch:(UISwitch*)sender
{
// disable the switch
sender.enabled = NO;

// start your long background work
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_NORMAL, 0), ^{
// ... some amazing work in the background, executed asynchronously ...

// Then, when finished, re-enable the switch:
dispatch_sync(dispatch_get_main_queue(), ^{
sender.enabled = YES;
});
});
}

PS:同样,如果您不使用任何在后台执行的线程或异步代码,而是使用在当前线程中同步执行的代码,那么您的问题根本不存在,因为您的 toggleOvertimeSwitch: 方法只会在一个步骤中不间断地执行,下一个 UI 事件(触摸等)只会在这之后才处理。

关于objective-c - 如何从 UISwitch 中删除目标,以避免因快速点击开关而产生的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12682141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com