Несколько кликов по UIButton запускают целевую функцию несколько раз

У меня есть UIButton. Я связал цель следующим образом.

[button addTarget:self action:@selector(myFunction) 
                forControlEvents:UIControlEventTouchUpInside];

Когда я быстро нажимаю кнопку несколько раз, она несколько раз вызывает целевую функцию. При нажатии кнопки я представляю новый контроллер представления. когда я быстро нажимаю 3 раза, мой новый контроллер представления отображается 3 раза.

Это что-то глупое. Какой смысл снова запускать функцию после того, как представление было перенесено на новый контроллер представления. Почему, черт возьми, Apple делает такие глупости?

Любая помощь, пожалуйста?


person waseemwk    schedule 22.06.2015    source источник


Ответы (4)


Во-первых, это не яблочные жуки. Это должно быть обработано вручную. Итак, следуйте этому шагу

Сначала сделайте свой глобальный экземпляр вашей кнопки, затем сделайте это

.h файл

@property (weak, nonatomic) IBOutlet UIButton *btn;

.м файл

- (IBAction)myFunction:(id)sender
{
    self.btn.userInteractionEnabled = NO;
}

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.btn.userInteractionEnabled = YES;
}
person Dharmbir Singh    schedule 22.06.2015

Возьмите один глобальный логический флаг, например «isItDone», или объявите его в классе singleton.

  1. в "myFunction" установите его как false
  2. какой контроллер View вы нажимаете на эту функцию в методе ViewDidAppear этого класса, установленном как true.

это поможет вам. У меня такая же проблема, и это хорошее решение для управления ею с помощью одной глобальной переменной.

person Pravin Tate    schedule 22.06.2015

Я думаю, это поможет вам.

Измените свою вызывающую функцию следующим образом

- (IBAction)myFunction:(id)sender
{
    UIButton *button = (UIButton*)sender;
    button.userInteractionEnabled = NO;
}

и вызовите свою функцию следующим образом

[button addTarget:self action:@selector(myFunction:) 
            forControlEvents:UIControlEventTouchUpInside];

если вы хотите сохранить выбор, если вы вернулись к контроллеру представления, вам нужно только сохранить логический флаг для сохранения, если он щелкнул один раз или нет.

person Mahesh Agrawal    schedule 22.06.2015
comment
Я думаю, но с помощью этого кода пользователь может нажимать только на эту кнопку, я прав или я что-то не понимаю? - person Pravin Tate; 22.06.2015
comment
Нет, верно. согласно моему ответу, пользователь может нажать кнопку только один раз, и если вы хотите, чтобы пользователь снова нажимал кнопку в любом состоянии, вы можете просто включить взаимодействие с пользователем, проверив. - person Mahesh Agrawal; 22.06.2015
comment
убедитесь, что вы вызываете функцию типа (myFunction:), а не только (myFunction) - person Mahesh Agrawal; 22.06.2015
comment
поэтому я думаю, что мы можем лучше управлять им, используя логическое значение, и это полезно для всех подобных ситуаций. что ты думаешь - person Pravin Tate; 22.06.2015
comment
ваш ответ верен для одной кнопки, но если есть много кнопок, и все они должны быть перемещены к одному viewController с некоторой логикой там с кнопкой, тогда мой ответ будет применим. Я говорю это, потому что я столкнулся с такой проблемой, которую я объясняю. Спасибо. - person Mahesh Agrawal; 22.06.2015

Установите IBOutlet на свою кнопку, в методе viewWillAppear напишите,

button.userInteractionEnabled = YES;

и при нажатии на кнопку set,

button.userInteractionEnabled = NO;
person Paddy    schedule 22.06.2015
comment
В чем разница между вашим и моим ответом?? - person Dharmbir Singh; 22.06.2015
comment
Зачем нужен IBOutlet ?? - person Dharmbir Singh; 22.06.2015