It's sekarang tetap pada [tag:ios7.1]
Don't melakukan tweak untuk memperbaikinya.
Rupanya masalah yang sama terjadi lagi di iOS 8.0 dan 8.1
It's sekarang tetap pada [tag:ios9.2]
Don't melakukan tweak untuk memperbaikinya.
Hai, Hari ini saya melihat di UISwitch's
Event ValueChanged:
Memanggil terus-menerus
sementara saya ubah ke On
untuk Off
atau Off
ke Atas dan jari saya pindah masih di sisi kanan serta kiri. Saya atteched gambar GIF untuk lebih jelas dengan NSLog.
Nilai saya Berubah Metode adalah:
- (IBAction)changeSwitch:(id)sender{
if([sender isOn]){
NSLog(@"Switch is ON");
} else{
NSLog(@"Switch is OFF");
}
}
iOS6 kode yang sama dari Switch bekerja dengan Baik seperti yang kita harapan:
sehingga siapa pun dapat menyarankan saya bahwa panggilan hanya satu kali keadaan On atau off. atau ini bug atau apa..?
UPDATE
Berikut ini adalah Demo saya itu:
Silahkan lihat kode berikut:
-(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");
}
}
Sama bug di sini. Saya pikir saya've ditemukan solusi sederhana. Kita hanya perlu menggunakan baru BOOL
yang menyimpan keadaan sebelumnya UISwitch
dan jika pernyataan di kami IBAction
(Nilai yang Berubah dipecat) untuk memeriksa bahwa nilai beralih telah benar-benar berubah.
previousValue = FALSE;
[...]
-(IBAction)mySwitchIBAction {
if(mySwitch.on == previousValue)
return;
// resetting the new switch value to the flag
previousValue = mySwitch.on;
}
Tidak ada lagi perilaku aneh. Semoga membantu.
Anda dapat menggunakan UISwitch
's .dipilih
properti untuk memastikan bahwa kode anda hanya mengeksekusi sekali ketika nilai aktual perubahan. Saya pikir ini adalah solusi yang bagus karena itu menghindari untuk subclass atau menambahkan sifat baru.
//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
}
}
Dan di sini adalah di Swift:
func doToggle(switch: UISwitch) {
if switch.on && !switch.selected {
switch.selected = true
// SWITCH ACTUALLY CHANGED -- DO SOMETHING HERE
} else {
switch.selected = false
}
}
Jika anda menggunakan begitu banyak beralih pada aplikasi anda maka tidak ada masalah untuk mengubah kode di semua tempat di mana t tindakan metode UISwitch didefinisikan.Anda dapat membuat kustom switch dan menangani peristiwa hanya jika nilai perubahan.
CustomSwitch.jam
#import <UIKit/UIKit.h>
@interface Care4TodayCustomSwitch : UISwitch
@end
CustomSwitch.m
@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
Kita mengabaikan peristiwa jika nilai sama seperti berubah nilai.Menempatkan CustomSwitch di semua kelas UISwitch dalam storyboard.Ini akan menyelesaikan masalah ini dan memanggil target hanya sekali ketika nilai berubah
Saya punya banyak pengguna yang menghadapi masalah yang sama, jadi mungkin ini adalah bug dari UISwitch
jadi aku menemukan hanya sekarang untuk solusi sementara dari itu. Saya Menemukan satu gitHub
custom KLSwitch
menggunakan ini untuk sekarang berharap apple akan memperbaikinya dalam update berikutnya dari xCode:-
Jika anda don't perlu bereaksi langsung ke switch's perubahan nilai berikut ini bisa menjadi solusi:
- (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];
}
}
Saya masih menghadapi masalah yang sama di iOS 9.2
Saya punya solusi dan berpose seperti itu mungkin membantu orang lain
int switchMethodCallCount = 0;
bool isSwitchOn = Tidak ada;
//Method ini akan dipanggil beberapa kali jika pengguna menyeret pada Switch, //Tapi keinginan tindakan harus melakukan hanya pada panggilan pertama dari metode ini
//1. 'switchMethodCallCount' variabel adalah menjaga untuk memeriksa jumlah calles untuk metode, //2. Tindakan peform untuk 'switchMethodCallCount = 1' i.e panggilan pertama //3. Ketika saklar nilai perubahan untuk negara lain, 'switchMethodCallCount' reset dan keinginan melakukan tindakan
switchMethodCallCount++ ;
//NSLog(@"Menghitung --> %d", switchMethodCallCount);
jika (switchMethodCallCount == 1) {
//NSLog(@"**Melakukan Acction**");
isSwitchOn = frontCameraCaptureSwitch.pada
[self doStuff];
} lain { //NSLog(@"tidak Melakukan");
jika (frontCameraCaptureSwitch.pada != isSwitchOn) {
switchMethodCallCount = 0;
isSwitchOn = frontCameraCaptureSwitch.pada
//NSLog(@"Hitung lagi mulai");
//memanggil nilai perubahan metode lagi [self frontCameraCaptureSwitchToggle:frontCameraCaptureSwitch];
} }
}
Ini masalah saya ketika saya mengikat beralih ke perilaku lain. Umumnya hal-hal yang don't ingin pergi dari on
ke on
. Berikut ini's my solusi sederhana:
@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
}
Hanya pastikan untuk juga mengatur diri.lastSwitchState
setiap kali anda secara manual mengubah mySwitch.on
! :)
Masalah jenis ini sering disebabkan oleh ValueChanged. Anda don't perlu menekan tombol untuk menyebabkan fungsi untuk menjalankan. It's tidak menyentuh acara. Setiap kali anda pemrograman mengubah saklar on/off, perubahan nilai dan panggilan IBAction berfungsi lagi.
@RoNiT memiliki jawaban yang tepat dengan:
Swift
func doToggle(switch: UISwitch) {
if switch.on && !switch.selected {
switch.selected = true
// SWITCH ACTUALLY CHANGED -- DO SOMETHING HERE
} else {
switch.selected = false
}
}
Ini bekerja untuk saya.
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()){
self.switch.isOn = true
}