【问题标题】:MonoTouch.Dialog - DateElement that accepts a null value as inputMonoTouch.Dialog - 接受空值作为输入的 DateElement
【发布时间】:2012-04-17 21:01:05
【问题描述】:

我搜索了互联网无济于事...我正在使用 MT.D 并想为使用 DateElement 的人设置生日,但生日可能为空,这意味着数据尚未收集了呢。有人知道如何让 DateElement 接受空值或日期吗?

【问题讨论】:

    标签: c# ios monotouch.dialog


    【解决方案1】:

    更新 20140106:自从 iOS7 发布以来,Apple 希望日期/时间选择器与内容一致,而不是作为操作表,或者在本例中为全屏覆盖。因此,此代码仅用于操作方法和历史目的。

    好的,所以我推出了自己的课程。就我个人而言,我认为当前的日期/时间选择器设置看起来不像有一个 ActionSheet 的弹出窗口那么专业,并附有一个日期选择器。 MT.D 比较有经验的人或许能弄明白,但我所做的是从DateTimeElementDateElement 复制代码并修改它,使其顶部有三个按钮:最左边的按钮是取消,右键区域有“Set”和“Null”按钮。右侧按钮的标题可以在类的ctor中设置为您喜欢的任何内容,但可以默认为“设置日期”和“无日期”。

    分享就是关怀!

    可为空的日期时间元素

    using MonoTouch.Foundation;
    using MonoTouch.UIKit;
    using System;
    using System.Drawing;
    
    namespace MonoTouch.Dialog
    {
        public class NullableDateTimeElement : StringElement
        {
            private class MyViewController : UIViewController
            {
                private NullableDateTimeElement container;
                private bool hasNullValue = false;
                private bool hasBeenSet = false;
                //private EventHandler nullButtonTouched;
                //UIButton isNullButton;
                public bool Autorotate
                {
                    get;
                    set;
                }
                public MyViewController (NullableDateTimeElement container)
                {
                    this.container = container;
                }
                public override void ViewDidLoad ()
                {
                    base.ViewDidLoad ();
                    //isNullButton = UIButton.FromType (UIButtonType.RoundedRect);
                    //isNullButton.SizeToFit ();
                    //isNullButton.Frame = new RectangleF(this.View.Frame.Top, this.View.Frame.Left, this.View.Frame.Width - 40f, 40f);
                    //isNullButton.SetTitle (container.NullButtonCaption, UIControlState.Normal);
                    this.NavigationItem.RightBarButtonItems = new UIBarButtonItem[]
                    {
                        new UIBarButtonItem(container.NullButtonCaption, UIBarButtonItemStyle.Done, NullButtonTapped),
                        new UIBarButtonItem(container.SetButtonCaption, UIBarButtonItemStyle.Done, SetButtonTapped)
                    };
                    this.NavigationItem.LeftBarButtonItem = new UIBarButtonItem(UIBarButtonSystemItem.Cancel, CancelTapped);
                    this.NavigationItem.HidesBackButton = true;
                    //this.View.AddSubview (isNullButton);
                    //this.isNullButton.TouchUpInside += (nullButtonTouched = new EventHandler(nullButtonWasTouched)); 
                }
    
                void CancelTapped(object sender, EventArgs e)
                {
                    hasBeenSet = false;
                    this.NavigationController.PopViewControllerAnimated (true);
                }
    
                void NullButtonTapped(object sender, EventArgs e)
                {
                    hasBeenSet = true;
                    hasNullValue = true;
                    this.NavigationController.PopViewControllerAnimated (true);
                }
    
                void SetButtonTapped(object sender, EventArgs e)
                {
                    hasBeenSet = true;
                    hasNullValue = false;
                    this.NavigationController.PopViewControllerAnimated (true);
                }
    
                public override void ViewWillDisappear (bool animated)
                {
                    base.ViewWillDisappear (animated);
                    if (hasBeenSet)
                    {
                        if (!hasNullValue)
                            this.container.DateValue = this.container.datePicker.Date;
                        else
                            this.container.DateValue = null;
                    }
                    //this.isNullButton.TouchUpInside -= nullButtonTouched;
                    //nullButtonTouched = null;
                }
                /*void nullButtonWasTouched(object sender, EventArgs e)
                {
                    hasNullValue = true;
                    NavigationController.PopViewControllerAnimated (true);
                }*/
                public override void DidRotate (UIInterfaceOrientation fromInterfaceOrientation)
                {
                    base.DidRotate (fromInterfaceOrientation);
                    this.container.datePicker.Frame = NullableDateTimeElement.PickerFrameWithSize (this.container.datePicker.SizeThatFits (SizeF.Empty));
                }
                public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation)
                {
                    return this.Autorotate;
                }
            }
            public DateTime? DateValue;
            public UIDatePicker datePicker;
            //public UIButton isNullButton;
            public string NullButtonCaption { get; set; }
            public string SetButtonCaption { get; set; }
    
            protected internal NSDateFormatter fmt = new NSDateFormatter
            {
                DateStyle = NSDateFormatterStyle.Short
            };
    
            public NullableDateTimeElement (string caption, DateTime? date, string nullButtonCaption, string setButtonCaption) : base (caption)
            {
                this.DateValue = date;
                this.Value = this.FormatDate (date);
                this.NullButtonCaption = nullButtonCaption;
                this.SetButtonCaption = setButtonCaption;
            }
    
            public NullableDateTimeElement(string caption, DateTime? date, string nullButtonCaption) : this(caption, date, nullButtonCaption, "Set Date")
            {}
    
            public NullableDateTimeElement(string caption, DateTime? date) : this(caption, date, "No Date", "Set Date")
            {}
    
            public override UITableViewCell GetCell (UITableView tv)
            {
                this.Value = this.FormatDate (this.DateValue);
                UITableViewCell cell = base.GetCell (tv);
                cell.Accessory = UITableViewCellAccessory.DisclosureIndicator;
                return cell;
            }
            protected override void Dispose (bool disposing)
            {
                base.Dispose (disposing);
                if (disposing)
                {
                    if (this.fmt != null)
                    {
                        this.fmt.Dispose ();
                        this.fmt = null;
                    }
    /*              if (this.isNullButton != null)
                    {
                        this.isNullButton.Dispose ();
                        this.isNullButton = null;
                    }*/
                    if (this.datePicker != null)
                    {
                        this.datePicker.Dispose ();
                        this.datePicker = null;
                    }
                }
            }
            public virtual string FormatDate (DateTime? dt)
            {
                if (dt.HasValue)
                    return this.fmt.ToString (dt.Value) + " " + dt.Value.ToLocalTime ().ToShortTimeString ();
                else
                    return NullButtonCaption;
            }
            public virtual UIDatePicker CreatePicker ()
            {
                return new UIDatePicker (RectangleF.Empty)
                {
                    AutoresizingMask = UIViewAutoresizing.FlexibleWidth,
                    Mode = UIDatePickerMode.DateAndTime,
                    Date = this.DateValue ?? DateTime.Now
                };
            }
            private static RectangleF PickerFrameWithSize (SizeF size)
            {
                RectangleF applicationFrame = UIScreen.MainScreen.ApplicationFrame;
                float y = 0f;
                float x = 0f;
                switch (UIApplication.SharedApplication.StatusBarOrientation)
                {
                    case UIInterfaceOrientation.Portrait:
                    case UIInterfaceOrientation.PortraitUpsideDown:
    
                        {
                            x = (applicationFrame.Width - size.Width) / 2f;
                            y = (applicationFrame.Height - size.Height) / 2f - 25f;
                            break;
                        }
                    case UIInterfaceOrientation.LandscapeRight:
                    case UIInterfaceOrientation.LandscapeLeft:
    
                        {
                            x = (applicationFrame.Height - size.Width) / 2f;
                            y = (applicationFrame.Width - size.Height) / 2f - 17f;
                            break;
                        }
                }
                return new RectangleF (x, y, size.Width, size.Height);
            }
            public override void Selected (DialogViewController dvc, UITableView tableView, NSIndexPath path)
            {
                NullableDateTimeElement.MyViewController myViewController = new NullableDateTimeElement.MyViewController (this)
                {
                    Autorotate = dvc.Autorotate
                };
                this.datePicker = this.CreatePicker ();
                this.datePicker.Frame = NullableDateTimeElement.PickerFrameWithSize (this.datePicker.SizeThatFits (SizeF.Empty));
                myViewController.View.BackgroundColor = UIColor.Black;
                myViewController.View.AddSubview (this.datePicker);
                dvc.ActivateController (myViewController);
            }
        }
    }
    

    可空日期元素

    using System;
    using MonoTouch.Foundation;
    using MonoTouch.UIKit;
    
    
    namespace MonoTouch.Dialog
    {
        public class NullableDateElement : NullableDateTimeElement
        {
            public NullableDateElement (string caption, DateTime? date, string nullButtonCaption, string setButtonCaption) : base (caption, date, nullButtonCaption, setButtonCaption)
            {
                initDateOnlyPicker ();
            }
    
            public NullableDateElement (string caption, DateTime? date, string nullButtonCaption) : base(caption, date, nullButtonCaption)
            {
                initDateOnlyPicker ();
            }
    
            public NullableDateElement (string caption, DateTime? date) : base(caption, date)
            {
                initDateOnlyPicker ();
            }
    
    
            void initDateOnlyPicker()
            {
                this.fmt.DateStyle = NSDateFormatterStyle.Medium;
            }
    
            public override string FormatDate (DateTime? dt)
            {
                if (dt.HasValue)
                    return this.fmt.ToString (dt);
                else
                    return base.NullButtonCaption;
            }
            public override UIDatePicker CreatePicker ()
            {
                UIDatePicker uIDatePicker = base.CreatePicker ();
                uIDatePicker.Mode = UIDatePickerMode.Date;
                return uIDatePicker;
            }
        }
    }
    

    @Miguel,请考虑将此添加到 MonoTouch.Dialog,因为对于空日期/日期时间存在非常合理的业务需求,并且此解决方案似乎可以解决问题。我的代码需要稍微清理一下,但这可行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 2021-12-29
      • 2018-04-03
      • 2021-10-29
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      相关资源
      最近更新 更多