Dodałem UISegmentedControl
w mojej aplikacji. Żaden z przycisków nie jest wybrany w normalnym stanie. Chcę zaimplementować zdarzenie click button po wybraniu pierwszego segmentu i inne zdarzenie po kliknięciu innego przycisku.Zdefiniuj zdarzenie click dla UISegmentedControl
Odpowiedz
Jeśli dobrze rozumiem pytanie, po prostu trzeba zaimplementować metoda docelowa (obsługiwana przez UIControl
, która jest klasą nadrzędną UISegmentedControl
) dla stałej UIControlEventValueChanged
, dokładnie tak, jak w przykładzie podanym w reference documentation użytkownika UISegmentControl.
tj
[segmentedControl addTarget:self
action:@selector(action:)
forControlEvents:UIControlEventValueChanged];
stosowane dla komunikatu o następującym podpis:
- (void)action:(id)sender
lub
[segmentedControl addTarget:self
action:@selector(action:forEvent:)
forControlEvents:UIControlEventValueChanged];
do
- (void)action:(id)sender forEvent:(UIEvent *)event
lub
[segmentedControl addTarget:self
action:@selector(action)
forControlEvents:UIControlEventValueChanged];
najprostszego sposobu:
- (void)action
które stanowią standardowe typy przełączników docelowego działania stosowanych w UIKit.
Po prostu szybkie heads up: Wierzę, że jeśli zdefiniujesz metodę jako - (void), wtedy będziesz chciał, żeby selektor był @selector (akcja), bo inaczej to się zawiesi. –
Selektor musi dokładnie odpowiadać wiadomości, ale bez parametrów, więc @selector (akcja: forEvent :) jest selektorem dla akcji "- (void): (id) sender forEvent: (UIEvent *) event" – Jonathan
Mam pytanie , czy ta czynność zostanie wywołana, nawet jeśli ręcznie zmienię wybrany indeks? Jeśli nie chcę, aby to się stało, czy mogę posłuchać jakiegoś innego zdarzenia kontrolnego? – JohnVanDijk
Możesz dołączyć obsługi w IB w przypadku wartości zmieniło: UIControlEventValueChanged
czy można zrobić to w kodzie:
[segmentedControl addTarget:self
action:@selector(action:)
forControlEvents:UIControlEventValueChanged];
Spróbuj tego,
UISegmentedControl * travelModeSegment = [[UISegmentedControl alloc] initWithItems:
[NSArray arrayWithObjects:NSLocalizedString(@"Driving", nil), NSLocalizedString(@"Walking", nil), nil]];
[travelModeSegment setFrame:CGRectMake(9.0f, 0.0f, 302.0f, 45.0f)];
[cell addSubview:travelModeSegment];
[travelModeSegment release];
następnie napisać skargę,
if (travelModeSegment.selectedSegmentIndex == 0) {
//write here your action when first item selected
} else {
//write here your action when second item selected
}
Mam nadzieję, że to pomoże Ci
Warto zauważyć, że selektor ma dopasować metodę dokładnie, ale bez faktycznych parametrów.
@selector(action)
=> -(void) action { ..code.. }
@selector(action:)
=> -(void) action:(id)sender { ..code.. }
@selector(action:forEvent:)
=> -(void) action:(id)sender forEvent:(UIEvent *)event { ..code.. }
To zdezorientowało mnie najdłużej i nie wynika to jasno z wcześniejszych odpowiedzi.
Dziękuję bardzo za wysiłek włożony w wyjaśnienie, Jonathan. To była jedna z tych rzeczy, które musiałem wyjaśnić dla siebie ...
spróbuj tego:
- (IBAction)segmentSwitch:(UISegmentedControl *)sender {
NSInteger selectedSegment = sender.selectedSegmentIndex;
if (selectedSegment == 0) {
}
else{
}
}
Proste tak, trzeba wykonać akcję pomocą storyboard do kontrolera widoku, tak aby ta akcja do pracy.
- (IBAction)searchSegmentedControl:(UISegmentedControl *)sender
{
switch (sender.selectedSegmentIndex) {
case 0:
NSLog(@"First was selected");
break;
case 1:
NSLog(@"Second was selected");
break;
case 2:
NSLog(@"Third was selected");
break;
default:
break;
}
}
do szybkiego zastosowania to:
segmentedControl.addTarget(self, action: "segmentSelected:", forControlEvents: UIControlEvents.ValueChanged)
i wdrożenie metody takie jak to:
func segmentSelected(sender: UISegmentedControl)
{
println("selected index: \(sender.selectedSegmentIndex)")
}
Extend UISegmentedControl jeśli chcesz zadzwonić do konkretnych działań, gdy wybrany jest wybrany Segment:
class CustomSegmentedControl : UISegmentedControl
{
override init()
{
super.init()
}
override init(frame:CGRect)
{
super.init(frame:frame)
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func valueChanged(index:Int)
{
// ACTION GOES HERE
}
}
i nazywają swoją "valueChanged" w "segmentSelected" tak:
func segmentSelected(sender: CustomSegmentedControl)
{
println("selected index: \(sender.selectedSegmentIndex)")
sender.valueChanged(sender.selectedSegmentIndex)
}
Prosta wersja szybkich aktualizowane
func loadControl(){
self.yourSegmentedControl.addTarget(self, action: #selector(segmentSelected(sender:)), forControlEvents: .valueChanged)
}
func segmentSelected(sender: UISegmentedControl)
{
let index = sender.selectedSegmentIndex
// Do what you want
}
najnowsza szybka składnia: self.segmentedControl.addTarget (self, akcja: #selector (segmentSelected (nadawca :)), dla: .valueChanged) – Gilles
Jak ustawić zwykły segmentu w UISegmented Control. Dzięki. – Pugal
@Pugal devan Ustaw właściwość stylu sterowania segmentami segmentedControl.segmentedControlStyle = UISegmentedControlStyleBordered; – Warrior