我正在尝试使用 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/