2011-11-21 2 views
3

UISegmentedControl을 사용하여 내 테이블의 정렬 순서를 제어하려고합니다. 특히 이미 선택되어있는 세그먼트에 탭을 등록하려고합니다 (역순으로 정렬 함) . 따라서 세그먼트를 탭할 때마다 UIControlEvent.ValueChanged 이벤트를 발생 시키려고합니다. 하여 세그먼트 컨트롤을 탭하면이 코드가 호출되지 것처럼 내가 UISegmentedControl에서 SelectedSegment을 무시하고 엑스 코드 내 요소에 대한이 사용자 정의 클래스를 사용하고MonoTouch : UISegmentedControl 이미 선택된 세그먼트 선택

은, 그러나,이 나타납니다 (이 뷰가 때 호출입니다 though though = S). 그러나 그 질문은 ObjC입니다, UISegmentedControl register taps on selected segment이 문제는 C#을/Monotouch입니다 :

[Register("ReselectableSegment")] 
public class ReselectableSegment : UISegmentedControl 
{ 
    static Selector selInit  = new Selector("init"); 

    [Export("init")] 
    public ReselectableSegment() 
     : base(NSObjectFlag.Empty) 
    { 
     Handle = Messaging.IntPtr_objc_msgSend(this.Handle, 
      selInit.Handle); 
    } 

    public ReselectableSegment (IntPtr handle) : base(handle){} 

    public override int SelectedSegment 
    { 
     [Export ("SelectedSegment:")] 
     set { 
      if(this.SelectedSegment == value) 
       this.SendActionForControlEvents(UIControlEvent.ValueChanged); 

      base.SelectedSegment = value; 
     } 
    } 
} 

이 질문에

은 이전에 요청하고있다.

답변

2

당신이 제공 한 질문 link의 마지막 답변에는 잘 작동하는 답변이 포함되어 있습니다 (나는 그것을 upvoted, 당신도 역시 ;-).

참고 : 이전 답변이 iOS4에서는 작동했지만 iOS5에서는 작동하지 않는 것으로 보입니다.

다음은 원하는 코드입니다. RectangleF .ctor를 사용하여 테스트 했으므로 다른 것을 사용하는 경우 자신의 .ctor를 추가해야 할 수도 있습니다.하지만 원래 코드만큼 복잡하지는 않습니다. 예를 들어이 클래스를 하위 클래스로 분류해야하는 셀렉터가 필요하지 않습니다.

class MyUISegmentedControl : UISegmentedControl { 

     public MyUISegmentedControl (RectangleF r) : base (r) {} 

     public override void TouchesBegan (NSSet touches, UIEvent evt) 
     { 
      int current = SelectedSegment; 
      base.TouchesBegan (touches, evt); 
      if (current == SelectedSegment) 
       SendActionForControlEvents (UIControlEvent.ValueChanged); 
     } 
    } 
+0

감사합니다. 죄송합니다. 답변으로 표시하는 데 오랜 시간이 걸렸으므로 여러 가지 일을 할 수 있습니다. 귀하의 반응은 많은 도움이되었습니다! – Symmetry

+0

자기 소개 ... "질문 링크의 마지막 대답"은 모호하며 움직이는 대상입니다. 질문보다는 답변에 대한 링크를 제공하는 것이 가장 좋습니다. –

0

제공된 링크는 iOS7에 대해 좋은 답변을 제공하지만 Objective C/Swift를 사용하여 특히 현재 선택한 항목을 다시 누르면 세그먼트를 선택 해제하는 데 적합합니다.

다음은 TouchesBegan 대신 TouchesEnded 이벤트를 사용해야하는 C# 버전입니다. TouchesBegan을 사용하면 UISegmentedControl.ValueChanged 이벤트가 두 번 발생하여 잘못된 동작이 발생했습니다.

이 코드에는 세그먼트를 건드린 후 이벤트를 취소하기 위해 컨트롤에서 끌 때의 처리가 포함됩니다. 주의 할

  // cell.SegmentedControl for me was a UISegmented control in a UITableViewCell 
      cell.SegmentedControl.ValueChanged += (s, e) => 
      { 
       OptionalSegmentedControl osc = (OptionalSegmentedControl)s; 

       // continue with your code logic..... 

      }; 

한 가지 내가 TouchesBegan 무효 진형하지만, 다음에 이름을 변경한다는 것입니다 :

class OptionalSegmentedControl : UISegmentedControl 
{ 


    public override void TouchesEnded(NSSet touches, UIEvent evt) 
    { 

     // Getting touch information to work out whether segment has been pressed, then dragged off to cancel the event 
     // Comment these lines out if you don't care about handling this 
     CGPoint locationPoint = ((UITouch)touches.AnyObject).LocationInView(this); 
     CGPoint viewPoint = this.ConvertPointFromView(locationPoint, this); 

     // Save the selected segment first 
     nint current = this.SelectedSegment; 

     // then fire the event 
     base.TouchesEnded(touches, evt); 


     // Check if the touch point is still on the control when the touch has ended, 
     // as well as comparing the current and new selected segment values 
     // and then fire the ValueChanged event if the same segment is pressed 


     // Use this line and comment the second if statement if you don't care about handling click and drag to cancel the event 
     //if (current == this.SelectedSegment) 
     if ((this.PointInside(viewPoint, evt)) && (current == this.SelectedSegment)) 
     { 
      this.SelectedSegment = -1; 
      SendActionForControlEvents(UIControlEvent.ValueChanged); 
     } 
    } 


} 

은 그 다음의 valueChanged 이벤트에 당신은 당신이 UISegmentedControl으로해야 할 일을 내가 그것을 깨달았을 때 TouchesEnded는 iOS7 이상에서 필요한 것입니다.

base.TouchesEnded(touches, evt); 

그래서 당신이 TouchesEnded에 TouchesBegan으로 변환하면 것을 변경하는 것을 잊지 마세요 : 나는 또한 줄을 변경했다 실현 될 때까지 여전히 작동하지 않았다.

관련 문제