kzen.dev
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
Nitin Gohel
Nitin Gohel
Question

iOS7 UISwitch Event ValueChanged: Menelepon terus menerus apakah ini Bug atau apa..?

Edit

It's sekarang tetap pada [tag:ios7.1]
Don't melakukan tweak untuk memperbaikinya.

Edit2

Rupanya masalah yang sama terjadi lagi di iOS 8.0 dan 8.1

Edit3

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:

program Add UISwitch

dari XIB menambahkan UISwitch

93 2013-10-28T06:22:48+00:00 12
Iulian Onofrei
Iulian Onofrei
Pertanyaan edit 13 Februari 2017 в 1:19
Pemrograman
ios
iphone
ios7
xcode5
uiswitch
 AeroStar
AeroStar
28 Oktober 2013 в 7:38
2013-10-28T07:38:52+00:00
Lebih
Sumber
Sunting
#22638889

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");
    }
}
 casillas
casillas
Jawaban edit 15 Desember 2015 в 4:32
45
0
 nnarayann
nnarayann
17 Januari 2014 в 11:15
2014-01-17T23:15:03+00:00
Lebih
Sumber
Sunting
#22638891

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.

 nnarayann
nnarayann
Jawaban edit 6 Februari 2014 в 5:19
12
0
 itsji10dra
itsji10dra
6 November 2015 в 8:21
2015-11-06T08:21:15+00:00
Lebih
Sumber
Sunting
#22638893

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
    }
}
 zekel
zekel
Jawaban edit 10 Februari 2016 в 9:30
12
0
 codester
codester
23 Maret 2014 в 10:05
2014-03-23T22:05:54+00:00
Lebih
Sumber
Sunting
#22638892

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

9
0
Solution / Answer
Nitin Gohel
Nitin Gohel
28 Oktober 2013 в 6:47
2013-10-28T06:47:40+00:00
Lebih
Sumber
Sunting
#22638888

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:-

https://github.com/KieranLafferty/KLSwitch

7
0
 pre
pre
20 November 2013 в 5:21
2013-11-20T17:21:49+00:00
Lebih
Sumber
Sunting
#22638890

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];
  }
}
6
0
Nick Kohrn
Nick Kohrn
19 Februari 2016 в 6:54
2016-02-19T18:54:47+00:00
Lebih
Sumber
Sunting
#22638895

Masalah ini masih di sini sebagai iOS 9.3 beta. Jika anda don't pikiran pengguna tidak mampu untuk menyeret luar dari switch, saya menemukan bahwa menggunakan .TouchUpInside daripada .ValueChanged bekerja andal.

3
0
Chetan Koli
Chetan Koli
19 Januari 2016 в 1:55
2016-01-19T13:55:15+00:00
Lebih
Sumber
Sunting
#22638894

Saya masih menghadapi masalah yang sama di iOS 9.2

Saya punya solusi dan berpose seperti itu mungkin membantu orang lain

  1. Membuat menghitung variabel untuk melacak berapa kali metode mendapat panggilan

int switchMethodCallCount = 0;

  1. Menyimpan bool nilai untuk beralih nilai

bool isSwitchOn = Tidak ada;

  1. Di Switch's nilai perubahan metode melakukan keinginan tindakan untuk metode pertama sebut saja. Ketika saklar nilai lagi perubahan set menghitung nilai t bool variabel nilai default
  • (IBAction)frontCameraCaptureSwitchToggle:(id)sender {

//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];

} }

}

2
0
Ben Leggiero
Ben Leggiero
21 April 2016 в 9:55
2016-04-21T21:55:39+00:00
Lebih
Sumber
Sunting
#22638896

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! :)

2
0
Dave G
Dave G
14 Januari 2017 в 1:11
2017-01-14T13:11:55+00:00
Lebih
Sumber
Sunting
#22638897

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
    }
}
1
0
 anuraagdjain
anuraagdjain
15 Mei 2018 в 4:31
2018-05-15T16:31:31+00:00
Lebih
Sumber
Sunting
#22638898
DispatchQueue.main.async {
        self.mySwitch.setOn(false, animated: true)
    }

Ini bekerja dengan baik dan doesn't panggilan pemilih berfungsi lagi.

0
0
 user3305074
user3305074
4 Maret 2019 в 10:25
2019-03-04T10:25:47+00:00
Lebih
Sumber
Sunting
#22638899

Ini bekerja untuk saya.

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()){
    self.switch.isOn = true
}
 barbsan
barbsan
Jawaban edit 4 Maret 2019 в 10:47
0
0
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Daniel Gogov
Terdaftar 1 minggu yang lalu
2
工藤 芳則
Terdaftar 2 minggu yang lalu
3
Ирина Беляева
Terdaftar 2 minggu yang lalu
4
Darya Arsenyeva
Terdaftar 2 minggu yang lalu
5
anyta nuam-nuam (LapuSiK)
Terdaftar 3 minggu yang lalu
ID
JA
© kzen.dev 2023
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi