Это's теперь исправлена на [тег:с iOS7.1] <БР>Дон'т сделать какие-либо настройки, чтобы исправить это.
Видимо, та же проблема повторится в iOS 8.0 и 8.1
Это's теперь исправлена на [метки:iOS 9 охота.2] <БР>Дон'т сделать какие-либо настройки, чтобы исправить это.
Привет сегодня я видел в UISwitch'с "событие" ValueChanged:призвание
постоянно`, пока я изменить на " ВКЛ " в "выкл" или " OFF " в положение ON и мой палец переместился еще на правом боку а также левую сторону. Я atteched GIF-изображения для более четкой с NSLog.
Мое измененное значение метода:
- (IBAction)changeSwitch:(id)sender{
if([sender isOn]){
NSLog(@"Switch is ON");
} else{
NSLog(@"Switch is OFF");
}
}
в iOS6 один и тот же код переключателя работает нормально, как мы ожидаем:
так может кто-нибудь предложить мне, что звонят только один раз его состояние вкл или выкл. или это баг или что..?
Обновление
Вот это мои демо:
Пожалуйста, см. следующий код:
-(void)viewDidLoad
{
[super viewDidLoad];
UISwitch *mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(130, 235, 0, 0)];
[mySwitch addTarget:self action:@selector(changeSwitch:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:mySwitch];
}
- (void)changeSwitch:(id)sender{
if([sender isOn]){
NSLog(@"Switch is ON");
} else{
NSLog(@"Switch is OFF");
}
}
Же здесь ошибка. Я думаю, что я'вэ нашел простое решение. Мы просто должны использовать новые буль
, который хранит предыдущее состояние UISwitch
и If в нашей IBAction` (измененное значение, мазут) проверить, что значение параметра изменилось.
previousValue = FALSE;
[...]
-(IBAction)mySwitchIBAction {
if(mySwitch.on == previousValue)
return;
// resetting the new switch value to the flag
previousValue = mySwitch.on;
}
Нет более странного поведения. Надеюсь, что это помогает.
Вы можете использовать UISwitch
'ы `.собственность выделен, чтобы убедиться, что ваш код выполняется только один раз, когда значение фактических изменений. Я думаю, что это отличное решение, ведь это позволяет избежать подкласс или добавить новые свойства.
//Add action for `ValueChanged`
[toggleSwitch addTarget:self action:@selector(switchTwisted:) forControlEvents:UIControlEventValueChanged];
//Handle action
- (void)switchTwisted:(UISwitch *)twistedSwitch
{
if ([twistedSwitch isOn] && (![twistedSwitch isSelected]))
{
[twistedSwitch setSelected:YES];
//Write code for SwitchON Action
}
else if ((![twistedSwitch isOn]) && [twistedSwitch isSelected])
{
[twistedSwitch setSelected:NO];
//Write code for SwitchOFF Action
}
}
И вот это в Swift:
func doToggle(switch: UISwitch) {
if switch.on && !switch.selected {
switch.selected = true
// SWITCH ACTUALLY CHANGED -- DO SOMETHING HERE
} else {
switch.selected = false
}
}
Если вы используете так много переключаться в приложение, то нет проблем поменять код во всех местах, где Т способ действия UISwitch определяется.Вы можете сделать заказ переключатель и обрабатывать события только при изменении значения.
CustomSwitch.ч
#import <UIKit/UIKit.h>
@interface Care4TodayCustomSwitch : UISwitch
@end
CustomSwitch.м
@interface CustomSwitch(){
BOOL previousValue;
}
@end
@implementation CustomSwitch
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
previousValue = self.isOn;
}
return self;
}
-(void)awakeFromNib{
[super awakeFromNib];
previousValue = self.isOn;
self.exclusiveTouch = YES;
}
- (void)setOn:(BOOL)on animated:(BOOL)animated{
[super setOn:on animated:animated];
previousValue = on;
}
-(void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event{
if(previousValue != self.isOn){
for (id targetForEvent in [self allTargets]) {
for (id actionForEvent in [self actionsForTarget:targetForEvent forControlEvent:UIControlEventValueChanged]) {
[super sendAction:NSSelectorFromString(actionForEvent) to:targetForEvent forEvent:event];
}
}
previousValue = self.isOn;
}
}
@end
Мы игнорируем события, если значение такое же, как изменилось значение.Поставить CustomSwitch в классе UISwitch в раскадровке.Это решит проблему и Целевой звонок только один раз, когда значение изменяется
У меня есть много пользователей, которые сталкиваются с той же проблемой, так что может быть это ошибка UISwitch
так что я нашел только сейчас для временного решения. Я нашел один на GitHubтаможня
KLSwitch` использовать это сейчас надеюсь, что Apple будет исправить это в следующем обновлении в Xcode:-
Если вы Don'т должны мгновенно реагировать на переключатель's стоимостью измените следующие решение:
- (IBAction)switchChanged:(id)sender {
[NSObject cancelPreviousPerformRequestsWithTarget:self];
if ([switch isOn]) {
[self performSelector:@selector(enable) withObject:nil afterDelay:2];
} else {
[self performSelector:@selector(disable) withObject:nil afterDelay:2];
}
}
Эта проблема по-прежнему здесь, как в бета-версию iOS 9.3. Если вы Don'т ум пользователя, не будучи в состоянии перетащить снаружи выключателя, я обнаружил, что, используя .TouchUpInside`, а не
.ValueChanged`` работает надежно.
Я по-прежнему сталкиваются с той же проблемой в iOS 9.2
Я получил решение и позирует как это может помочь другим
инт switchMethodCallCount = 0;
боол isSwitchOn = нет;
//Этот метод будет вызываться несколько раз, если пользователь перетаскивает на переключатель, //Но желание действия следует выполнять только при первом вызове этого метода
//1. 'switchMethodCallCount' переменная поддерживать, чтобы проверить количество звонков в способ, //2. Действие выполните для 'switchMethodCallCount = 1' я.е первый звонок //3. Когда значение переключателя изменить в другое государство, 'switchMethodCallCount' сбрасывается и желание выполнять действия
switchMethodCallCount++ ;
//NSLog(@"и считать --> %Д" и, switchMethodCallCount);
если (switchMethodCallCount == 1) {
//NSLog(@&я;**выполните г.**&и");
isSwitchOn = frontCameraCaptureSwitch.на
[сам doStuff];
} еще { //NSLog(@"не выполнять на");
если (frontCameraCaptureSwitch.о != isSwitchOn) {
switchMethodCallCount = 0;
isSwitchOn = frontCameraCaptureSwitch.на
//NSLog(@"и граф снова начать и");
//стоимости вызова снова изменить способ [сам frontCameraCaptureSwitchToggle:frontCameraCaptureSwitch];
} }
}
Эта проблема мучает меня, когда я привязываю выключатель к другой модели поведения. Как правило, вещи Дон'т, как перейти от НА
НА о
. Здесь'мое простое решение:
@interface MyView : UIView
@parameter (assign) BOOL lastSwitchState;
@parameter (strong) IBOutlet UISwitch *mySwitch;
@end
@implementation MyView
// Standard stuff goes here
- (void)mySetupMethodThatsCalledWhenever
{
[self.mySwitch addTarget:self action:@selector(switchToggled:) forControlEvents:UIControlEventValueChanged];
}
- (void)switchToggled:(UISwitch *)someSwitch
{
BOOL newSwitchState = self.mySwitch.on;
if (newSwitchState == self.lastSwitchState)
{
return;
}
self.lastSwitchState = newSwitchState;
// Do your thing
}
Просто убедитесь, что сеть самостоятельно.каждый раз lastSwitchStateвы меняете вручную
mySwitch.о! :)
Этот тип проблемы часто вызваны ValueChanged. Вы Don'т нужно нажать на кнопку, чтобы вызвать функцию для выполнения. Это's не сенсорный событие. Каждый раз, когда вы программно измените переключатель включения/выключения, изменения стоимости, и это вызывает функцию IBAction снова.
@Ронит имел право ответить:
Свифт
func doToggle(switch: UISwitch) {
if switch.on && !switch.selected {
switch.selected = true
// SWITCH ACTUALLY CHANGED -- DO SOMETHING HERE
} else {
switch.selected = false
}
}
DispatchQueue.main.async {
self.mySwitch.setOn(false, animated: true)
}
Это прекрасно работает и не't называет переключатель функция снова.
Этот работал для меня.
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()){
self.switch.isOn = true
}