আইওএস 7 ইউআইএস এর ইভেন্টের মান পরিবর্তন করুন: ক্রমাগত কল করা কি এই বাগ বা কী ..?


93

সম্পাদনা করুন

এটি এখন ঠিক করা হয়েছে
এটি সংশোধন করার জন্য কোনও টুইটক করবেন না।

সম্পাদনা 2

স্পষ্টতই একই সমস্যাটি আবার আইওএস 8.0 এবং 8.1 এ ঘটে

সম্পাদনা 3

এটি এখন ঠিক করা হয়েছে
এটি সংশোধন করার জন্য কোনও টুইটক করবেন না।


হাই আজ আমি দেখা UISwitch'sইভেন্ট ValueChanged:কলিং continuously যখন আমি পরিবর্তন am Onকরার Offবা Offউপর এবং আমার আঙ্গুল বাম পাশে সেইসাথে ডান দিকে এখনো সরানো। এনএসএলগের সাথে আরও পরিষ্কার করার জন্য আমি জিআইএফ চিত্রটি সত্যায়িত করেছি।

এখানে চিত্র বর্ণনা লিখুন

আমার মান পরিবর্তিত পদ্ধতিটি হ'ল:

- (IBAction)changeSwitch:(id)sender{

    if([sender isOn]){
        NSLog(@"Switch is ON");
    } else{
        NSLog(@"Switch is OFF");
    }
    
}

iOS6 একই প্রত্যাশা অনুসারে স্যুইচ ওয়ার্কিংয়ের একই কোড:

এখানে চিত্র বর্ণনা লিখুন

সুতরাং যে কেউ আমাকে কল করতে পারে যে কেবল একবার কল করার সময় তার অবস্থা চালু বা বন্ধ থাকে। বা এটি একটি বাগ বা কি ..?

হালনাগাদ

এটি এখানে আমার ডেমো:

প্রোগ্রাম্যাটিক যুক্ত ইউআইএসউইচ

XIB থেকে ইউআইএসউইচ যোগ করা


4
আমি এই ত্রুটিটি এখনও সিমুলেটারে আইওএস 7.1 এ পেয়েছি, এখনও ডিভাইসটি ব্যবহারের চেষ্টা করিনি,
এক্সকোড

4
আমি 7.1.2 আইপ্যাডের সাথে একই সমস্যা পেয়েছি
হাসি

7
আমি ইউএসআইভিচ-এর সাথে আইওএস 8.0 এবং 8.1
তিব্বতের সমুদ্র উপকূল

4
এখনও এখানে 9.1। দয়া করে ওপেনার্ডার.অ্যাপস্পট . com / 15555929 প্রত্যেকের একটি সদৃশ ফাইল করুন । এই একমাত্র উপায় আমরা এটি স্থির করতে যাচ্ছি।
গিলাইম অ্যালগিস

4
দেখে মনে হচ্ছে এটি 9.3 এ ফিরে এসেছে
বেন লেগজিও

উত্তর:


44

দয়া করে নীচের কোডটি দেখুন:

-(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");
    }
}

thx উত্তরের জন্য যেমন আমি বলেছিলাম যে আমি উভয়ভাবে চেষ্টা করছি এবং একই ফলাফল পেয়েছি। এটলিস্ট আমি জেনেছিলাম কীভাবে সুইটিক প্রোগ্রাম্যাটিক যুক্ত করতে পারবেন পাশাপাশি xib স্যার থেকেও।
নিতিন গোহেল

12

একই বাগ এখানে। আমি মনে করি আমি একটি সহজ কাজ খুঁজে পেয়েছি। আমাদের কেবলমাত্র একটি নতুন ব্যবহার করতে হবে BOOLযা আমাদের পূর্বের স্টেটের সংরক্ষণ করে UISwitchএবং আমাদের IBAction(মান বদলানো ফায়ারড) বিবৃতিতে স্যুইচের মানটি আসলে পরিবর্তিত হয়েছে কিনা তা পরীক্ষা করতে হয়।

previousValue = FALSE;

[...]

-(IBAction)mySwitchIBAction {
    if(mySwitch.on == previousValue)
        return;
    // resetting the new switch value to the flag
    previousValue = mySwitch.on;
 }

আর অদ্ভুত আচরণ নেই। আশা করি এটা সাহায্য করবে.


4
এটি কেবল যদি বলা উচিত (mySwitch.on == পূর্ববর্তী মূল্য)
কেগান জে

12

আপনার কোডটি একবারে কার্যকর হয় যখন মানটি আসল পরিবর্তিত হয় তা নিশ্চিত করতে আপনি UISwitchএর .selectedসম্পত্তি ব্যবহার করতে পারেন । আমি মনে করি এটি একটি দুর্দান্ত সমাধান কারণ এটি সাবক্লাস করা বা নতুন বৈশিষ্ট্য যুক্ত করা এড়িয়ে চলে।

 //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
    }
}

এবং এটি সুইফটে রয়েছে:

func doToggle(switch: UISwitch) {
    if switch.on && !switch.selected {
        switch.selected = true
        // SWITCH ACTUALLY CHANGED -- DO SOMETHING HERE
    } else {
        switch.selected = false
    }
}

6
আমি এটি সবচেয়ে সহজ বলে মনে করি।
জেকেল

এটি +1 করেছে কারণ আমি টগল যুক্তিটিকে উপেক্ষা করতে চাইলে এটি .ট্যাগ মানটি জনসাধারণের অনুরূপ সমাধানটি ব্যবহার করতে আমার দিকে পরিচালিত করে। মাঝেমধ্যে উভয় অন এবং অফ মোডে ফায়ার করার জন্য আমার যুক্তি প্রয়োজন যাতে উপরেরটি যথেষ্ট পর্যাপ্ত ছিল না।
ডেভিডেথেল

9

আপনি যদি আপনার অ্যাপ্লিকেশনে অনেকগুলি স্যুইচ ব্যবহার করছেন তবে ইউআইএসভিচের টি ক্রিয়া পদ্ধতিটি সংজ্ঞায়িত করা সমস্ত জায়গায় কোড পরিবর্তন করতে সমস্যা আছে problem আপনি মান পরিবর্তন করতে পারেন তবেই কাস্টম স্যুইচ করতে পারেন এবং ইভেন্টগুলি পরিচালনা করতে পারেন।

CustomSwitch.h

#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

মানটি পরিবর্তিত মানের হিসাবে একই হলে আমরা ইভেন্টগুলি উপেক্ষা করছি story স্টোরিবোর্ডে ইউআইএসવિচের সমস্ত শ্রেণিতে কাস্টমসুইচ রাখুন value সমস্যাটি সমাধান করবে এবং মান পরিবর্তিত হলেই টার্গেট কল করবে value


এটি আমার পক্ষে কাজ করেছে। এটি আদর্শ কারণ এটি পুনরায় ব্যবহারযোগ্য এবং শ্রেণি প্রয়োগের অভ্যন্তরে এর প্রয়োগটি গোপন করে, কারণ এটি আপনার বাস্তবায়নকারী ফাইলগুলিতে ম্যানুয়ালি বহিরাগত কোড যুক্ত হওয়ার কারণ না করে। এটি ঠিক ভাল নকশা। এই উত্তরে আরও মন্তব্য থাকলে এটি দুর্দান্ত হবে, কারণ কোডটি কেন রয়েছে তা আমি সত্যিই বুঝতে পারি না।
জেমস সি

ধন্যবাদ, এটি আমার পক্ষে কাজ করেছে। আপনি কোডটি আরও কিছুটা ব্যাখ্যা করতে পারেন। @ কোডস্টার
স্বয়ম্ভু

7

আমি অনেক ব্যবহারকারীর কাছে পেয়েছি যে একই সমস্যাটির মুখোমুখি হওয়ায় এটি UISwitchসম্ভবত এটি বাগ হওয়ায় এটির অস্থায়ী সমাধানের জন্য আমি এখনই খুঁজে পেয়েছি। আমি এই মুহুর্তে এটির জন্য একটি gitHubকাস্টম KLSwitchব্যবহারের সন্ধান পেয়েছি আশা করি অ্যাপল এক্সকোডের পরবর্তী আপডেটে এটি ঠিক করবে: -

https://github.com/KieranLafferty/KLSwitch


6

আপনার যদি সুইচটির মান পরিবর্তনের বিষয়ে তাত্ক্ষণিক প্রতিক্রিয়া না দেখানোর দরকার হয় তবে নিম্নলিখিত সমাধান হতে পারে:

- (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];
  }
}

আইওএস ১১.২ এ কবজির মতো কাজ করেছেন। আমার পরিস্থিতিতে এটি পরপর দুটি ইভেন্টে গুলি চালিয়েছিল (রাষ্ট্র: বন্ধ, সোয়াইপিং: অফ, 1 ম ইভেন্ট: অন, 2 য় ইভেন্ট: অফ), সুতরাং 0.1 এর বিলম্ব আমার পক্ষে যথেষ্ট এবং কোনও ব্যবহারকারীর নজরে আসে না।
পল সেমিওনভ

3

আইওএস 9.3 বিটা হিসাবে এখনও এই সমস্যাটি এখানে রয়েছে। আপনি যদি ব্যবহারকারীটিকে স্যুইচের বাইরে টেনে আনতে সক্ষম না করেন তবে আমি দেখতে পাচ্ছি যে নির্ভরযোগ্যভাবে কাজ .TouchUpInsideকরার চেয়ে ব্যবহার করা .ValueChanged


2

আমি এখনও আইওএস 9.2 তে একই সমস্যার মুখোমুখি হয়েছি

আমি সমাধান পেয়েছি এবং তা তুলে ধরেছি কারণ এটি অন্যকে সহায়তা করতে পারে

  1. পদ্ধতিটি কল পেয়েছে তার সংখ্যার সন্ধান করতে কাউন্ট ভেরিয়েবল তৈরি করুন

    int switchMethodCallCount = 0;
    
  2. স্যুইচ মানের জন্য বুল মান সংরক্ষণ করুন

    bool isSwitchOn = No;
    
  3. স্যুইচ এর মান পরিবর্তন পদ্ধতিতে শুধুমাত্র প্রথম পদ্ধতি কলের জন্য ইচ্ছা ক্রিয়া সম্পাদন করুন। যখন স্যুইচ মান আবার সেট করে কাউন্ট মান এবংtt বুল ভেরিয়েবল মান ডিফল্ট

    - (IBAction)frontCameraCaptureSwitchToggle:(id)sender {
    
    
    
    //This method will be called multiple times if user drags on Switch,
    //But desire action should be perform only on first call of this method
    
    
    //1. 'switchMethodCallCount' variable is maintain to check number of calles to method,
    //2. Action is peform for 'switchMethodCallCount = 1' i.e first call
    //3. When switch value change to another state, 'switchMethodCallCount' is reset and desire action perform
    
    switchMethodCallCount++ ;
    
    //NSLog(@"Count --> %d", switchMethodCallCount);
    
    if (switchMethodCallCount == 1) {
    
    //NSLog(@"**************Perform Acction******************");
    
    isSwitchOn = frontCameraCaptureSwitch.on
    
    [self doStuff];
    
    }
    else
    {
    //NSLog(@"Do not perform");
    
    
    if (frontCameraCaptureSwitch.on != isSwitchOn) {
    
        switchMethodCallCount = 0;
    
        isSwitchOn = frontCameraCaptureSwitch.on
    
        //NSLog(@"Count again start");
    
        //call value change method again 
        [self frontCameraCaptureSwitchToggle:frontCameraCaptureSwitch];
    
    
        }
    }
    
    
    }
    

আমিও 9.2-এ এই সমস্যার মুখোমুখি আছি। আমি আপনার যুক্তি বাস্তবায়ন করেছি, এবং এখন এটি আমার ইচ্ছা অনুসারে কাজ করছে।
নিক কোহরন

2

যখন আমি অন্যান্য আচরণের সাথে সুইচটি বেঁধে রাখি তখন এই সমস্যাটি আমাকে জর্জরিত করে। সাধারণত কিছু থেকে যেতে পছন্দ করি না onকরতে on। এখানে আমার সহজ সমাধান:

@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
}

self.lastSwitchStateআপনি নিজে প্রতিটি সময় ম্যানুয়ালি পরিবর্তন করার সময়ও সেট করতে ভুলবেন না mySwitch.on! :)


1

এই ধরণের সমস্যাটি প্রায়শই ValueChanged দ্বারা সৃষ্ট হয়। ফাংশনটি চালুর জন্য আপনাকে বোতামটি টিপতে হবে না। এটি কোনও স্পর্শ ইভেন্ট নয়। প্রতিবার আপনি প্রোগ্রামযুক্তভাবে স্যুইচটি অন / অফে পরিবর্তন করুন, মান পরিবর্তন হয় এবং এটি আবার আইবিএ ফাংশনটিকে কল করে।

@ রোনিটির সঠিক উত্তর ছিল:

সুইফট

func doToggle(switch: UISwitch) {
    if switch.on && !switch.selected {
        switch.selected = true
        // SWITCH ACTUALLY CHANGED -- DO SOMETHING HERE
    } else {
        switch.selected = false
    }
}

0
DispatchQueue.main.async {
        self.mySwitch.setOn(false, animated: true)
    }

এটি সূক্ষ্মভাবে কাজ করে এবং নির্বাচককে আবার কাজ করতে কল করে না।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.