UIControlEventValueChanged не работает, когда я коснулся уже выбранного сегмента сегмента
Моя цель - снова вызвать делегат UIControlEventValueChanged, когда я коснулся уже выбранного сегмента.
Поэтому я сослался на ссылки ниже
UISegmentedControl-регистр-краны-на-выбранный сегмент
поддержание выбора-в-UISegmentedControl
По ссылкам я создал подкласс uisegmentedcontrol, реализовал - (void) setSelectedSegmentIndex:(NSInteger)toValue {
метод и написал коды (по ссылкам выше).
Работает нормально с Ipad1. Однако setSelectedSegmentIndex в унаследованном / подклассе не срабатывает в Ipad2 при касании уже выбранного сегмента!!!! однако он работает нормально, когда я нажал на невыбранный индекс сегмента.
Код, который я сделал ниже
Основной класс
ReselectableSegmentControl *firstNextSegmentedControl = [[ReselectableSegmentControl alloc] init];
firstNextSegmentedControl.frame = CGRectMake(xCordinate, 255, 188, 50);
firstNextSegmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
firstNextSegmentedControl.tag = index + 1;
[firstNextSegmentedControl addTarget:self action:@selector(firstNextThenSegmentedControlValueChanged:) forControlEvents:UIControlEventValueChanged];
[firstNextSegmentedControl insertSegmentWithImage:[UIImage imageNamed:@"NoTimerCounter.png"] atIndex:0 animated:YES];
[firstNextSegmentedControl insertSegmentWithImage:[UIImage imageNamed:@"Timer.png"] atIndex:1 animated:YES];
[firstNextSegmentedControl insertSegmentWithImage:[UIImage imageNamed:@"Counter.png"] atIndex:2 animated:YES];
firstNextSegmentedControl.selectedSegmentIndex = 0;
[self.view addSubview:firstNextSegmentedControl];
[firstNextSegmentedControl release];
firstNextSegmentedControl = nil;
UISegmentSubClass .h файл
#import <Foundation/Foundation.h>
@interface ReselectableSegmentControl : UISegmentedControl {
}
@end
UISegmentSubClass .m файл
-(void)setSelectedSegmentIndex:(NSInteger )selectedValue{
if (selectedValue==self.selectedSegmentIndex) {
[self sendActionsForControlEvents:UIControlEventValueChanged];
}
[super setSelectedSegmentIndex:selectedValue];
}
или же
-(void)setSelectedSegmentIndex:(NSInteger )selectedValue{
if (self.selectedSegmentIndex == selectedValue) {
//doing my operation if tapped again the selected value.
else {
super.selectedSegmentIndex = selectedValue;
}
}
или же
- (void) setSelectedSegmentIndex:(NSInteger)toValue {
if (self.selectedSegmentIndex == toValue) {
[super setSelectedSegmentIndex:UISegmentedControlNoSegment];
} else {
[super setSelectedSegmentIndex:toValue];
}
}
Все вышеперечисленные методы не работают с Ipad2.
Любая помощь по этому вопросу приветствуется.
Благодарю.
1 ответ
Фу... наконец я получил решение..
Я использовал UITapGestureRecognizer вместо использования addTarget:self action:@selector()
Теперь мой код выглядит так:
UISegmentedControl *firstNextSegmentedControl = [[UISegmentedControl alloc] init];
firstNextSegmentedControl.frame = CGRectMake(xCordinate, 255, 188, 50);
firstNextSegmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
firstNextSegmentedControl.selectedSegmentIndex = 0;
[firstNextSegmentedControl insertSegmentWithImage:[UIImage imageNamed:@"NoTimerCounter.png"] atIndex:0 animated:YES];
[firstNextSegmentedControl insertSegmentWithImage:[UIImage imageNamed:@"Timer.png"] atIndex:1 animated:YES];
[firstNextSegmentedControl insertSegmentWithImage:[UIImage imageNamed:@"Counter.png"] atIndex:2 animated:YES];
//Added UITapGestureRecognizer instead of using addTarget: method
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] init];
tapGesture addTarget:self action:@selector(firstNextThenSegmentedControlValueChanged:) ];
[firstNextSegmentedControl addGestureRecognizer:tapGesture];
[tapGesture release];
tapGesture = nil;
[self.view addSubview:firstNextSegmentedControl];
[firstNextSegmentedControl release];
firstNextSegmentedControl = nil;
-(void)firstNextThenSegmentedControlValueChanged:(UITapGestureRecognizer *)tapGesture{
UISegmentedControl *segmentControl = (UISegmentedControl *)tapGesture.view;
switch (segmentControl.selectedSegmentIndex) {
case 0:
[self doIt:segmentControl];
break;
default:
break;
}
}