我正在尝试使用 UISegmentedControl 来控制我的表的排序顺序,特别是我想在已经选择的段上注册一个点击(以反转我的排序)。因此,每当点击任何段时,我都会尝试引发 UIControlEvent.ValueChanged 事件。

我已经从 SelectedSegment 覆盖了 UISegmentedControl 并且我在 xcode 中为我的元素使用了这个自定义类,但是,当点击 Segment 控件时,似乎没有调用此代码(尽管 =S,但在加载 View 时调用了 )。

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

这个问题之前在: UISegmentedControl register taps on selected segment 被问过,但是这个问题是针对 ObjC 的,这个问题是针对 C#/Monotouch 的。

最佳答案

您提供的 link 问题的最后一个答案包含最佳(运行良好)答案(我赞成,您也应该这样做;-)。

注意:从评论看来,以前的答案(可能)适用于 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);
        }
    }

关于c# - MonoTouch : UISegmentedControl Select a segment that is already selected,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8206835/

10-15 13:21