2010-06-15 32 views
56

Tôi đã thêm UISegmentedControl vào đơn đăng ký của mình. Không có nút nào được chọn ở trạng thái bình thường. Tôi muốn triển khai sự kiện nhấp nút khi phân khúc đầu tiên được chọn và một sự kiện khác khi nhấp vào một nút khác.Xác định sự kiện nhấp cho UISegmentedControl

+0

Làm thế nào để tôi đặt phân khúc đồng bằng trong UISegmented Control. Cảm ơn. – Pugal

+0

@Pugal devan đặt phân khúc thuộc tính kiểu kiểm soát phân khúcControl.segmentedControlStyle = UISegmentedControlStyleBordered; – Warrior

Trả lời

122

Nếu tôi hiểu câu hỏi của bạn một cách chính xác, bạn chỉ cần có để thực hiện một phương thức hành động mục tiêu (được hỗ trợ bởi UIControl là lớp cha mẹ của UISegmentedControl) cho hằng số UIControlEventValueChanged, chính xác như trong ví dụ được đưa ra trong số reference documentation của UISegmentControl.

ví dụ:

[segmentedControl addTarget:self 
        action:@selector(action:) 
      forControlEvents:UIControlEventValueChanged]; 

sử dụng cho một tin nhắn với chữ ký sau đây:

- (void)action:(id)sender 

hoặc

[segmentedControl addTarget:self 
        action:@selector(action:forEvent:) 
      forControlEvents:UIControlEventValueChanged]; 

cho

- (void)action:(id)sender forEvent:(UIEvent *)event 

hoặc

[segmentedControl addTarget:self 
        action:@selector(action) 
      forControlEvents:UIControlEventValueChanged]; 

đối với phương pháp đơn giản nhất:

- (void)action 

đó là loại tiêu chuẩn của bộ chọn mục tiêu hành động sử dụng trong UIKit.

+5

Chỉ cần thông báo nhanh: Tôi tin rằng nếu bạn xác định phương thức là - (void) thì bạn sẽ muốn bộ chọn là @selector (action) hoặc nếu không nó sẽ bị lỗi. –

+1

Bộ chọn phải khớp chính xác với thông báo, nhưng không có tham số, vì vậy @selector (action: forEvent :) là bộ chọn cho hành động "- (void): (id) choEvent: (UIEvent *) event" – Jonathan

+0

Tôi có một câu hỏi , hành động này sẽ được gọi ngay cả khi tôi thay đổi chỉ mục đã chọn theo cách thủ công? Nếu tôi không muốn điều đó xảy ra, tôi có thể nghe một số sự kiện kiểm soát khác không? – JohnVanDijk

2

Bạn có thể đính kèm một handler trong IB đến sự kiện giá trị thay đổi: UIControlEventValueChanged

hoặc bạn có thể làm điều đó trong mã:

[segmentedControl addTarget:self 
        action:@selector(action:) 
      forControlEvents:UIControlEventValueChanged]; 
9

Hãy thử thế này,

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

sau đó viết một hành động,

 if (travelModeSegment.selectedSegmentIndex == 0) { 
     //write here your action when first item selected 
    } else { 
     //write here your action when second item selected 
    } 

Tôi hy vọng nó sẽ giúp bạn

7

Nó đáng chú ý là bộ chọn phải phù hợp với một phương pháp chính xác, nhưng không có thông số thực tế.

@selector(action) 
    => -(void) action { ..code.. } 

@selector(action:) 
    => -(void) action:(id)sender { ..code.. } 

@selector(action:forEvent:) 
    => -(void) action:(id)sender forEvent:(UIEvent *)event { ..code.. } 

Điều này làm tôi bối rối trong thời gian dài nhất và không rõ ràng so với câu trả lời trước đó.

+1

Cảm ơn bạn rất nhiều vì đã cố gắng giải thích, Jonathan. Đây là một trong những điều tôi cần phải làm rõ cho bản thân mình ... erm ... 'đôi khi bây giờ' ;-) 'Cũng được trình bày rõ ràng; nó đã đi thẳng vào thư viện mã của tôi! :-) – Slowburner

64

thử điều này:

- (IBAction)segmentSwitch:(UISegmentedControl *)sender { 
     NSInteger selectedSegment = sender.selectedSegmentIndex; 

     if (selectedSegment == 0) { 

     } 
     else{ 

     } 
    } 
4

đơn giản như vậy, bạn cần phải thực hiện hành động bằng cách sử dụng kịch bản để điều khiển xem để làm cho hành động này để làm việc.

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

để sử dụng SWIFT này:

segmentedControl.addTarget(self, action: "segmentSelected:", forControlEvents: UIControlEvents.ValueChanged) 

và thực hiện một phương pháp như thế này:

func segmentSelected(sender: UISegmentedControl) 
{ 
    println("selected index: \(sender.selectedSegmentIndex)") 
} 

Mở rộng UISegmentedControl nếu bạn muốn gọi một hành động cụ thể khi phân khúc được chọn sẽ được chọn:

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

và gọi bạn "valueChanged" trong "segmentSelected" như thế này:

func segmentSelected(sender: CustomSegmentedControl) 
{ 
    println("selected index: \(sender.selectedSegmentIndex)") 
    sender.valueChanged(sender.selectedSegmentIndex) 
} 
3

phiên bản đơn giản trong nhanh chóng cập nhật

func loadControl(){ 
    self.yourSegmentedControl.addTarget(self, action: #selector(segmentSelected(sender:)), forControlEvents: .valueChanged) 
} 

func segmentSelected(sender: UISegmentedControl) 
{ 
    let index = sender.selectedSegmentIndex 

    // Do what you want 
} 
+1

cú pháp nhanh nhất mới nhất: self.segmentedControl.addTarget (self, action: #selector (segmentSelected (sender :)), for: .valueChanged) – Gilles

Các vấn đề liên quan