草庐IT

c# - MonoTouch.Dialog - 接受空值作为输入的 DateElement

coder 2024-01-21 原文

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

最佳答案

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

好的,所以我推出了自己的类(class)。我个人认为当前的日期/时间选择器设置看起来不像弹出一个带有日期选择器的等效 ActionSheet 那样专业。对 MT.D 更有经验的人可能能够弄清楚,但我所做的是从 DateTimeElementDateElement 复制代码并修改它,使其具有三个buttons on top:最左边的按钮是Cancel,右边的按钮区有“Set”和“Null”按钮。右侧按钮的标题可以在类的构造函数中设置为您喜欢的任何内容,但可以默认为“设置日期”和“无日期”。

分享就是关怀!

可为空的日期时间元素

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,因为对空日期/日期时间有非常合理的业务需求,并且此解决方案似乎可以解决问题。我的代码需要稍微清理一下,但这行得通。

关于c# - MonoTouch.Dialog - 接受空值作为输入的 DateElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10199084/

有关c# - MonoTouch.Dialog - 接受空值作为输入的 DateElement的更多相关文章

  1. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  2. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  3. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  4. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  5. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  6. ruby-on-rails - 应用程序的名称是否可以作为变量使用? - 2

    当我创建一个Rails应用程序时,控制台:railsnewfoo我的代码可以使用字符串“foo”吗?puts"Yourapp'snameis"+app_name_bar 最佳答案 Rails.application.class将为您提供应用程序的全名(例如YourAppName::Application)。从那里您可以使用Rails.application.class.parent获取模块名称。 关于ruby-on-rails-应用程序的名称是否可以作为变量使用?,我们在StackOve

  7. ruby-on-rails - 使用作为方法的值在 ruby​​ 中搜索哈希 - 2

    我在搜索我的值是方法的散列时遇到问题。我只是不想运行plan_type与键匹配的方法。defmethod(plan_type,plan,user){foo:plan_is_foo(plan,user),bar:plan_is_bar(plan,user),waa:plan_is_waa(plan,user),har:plan_is_har(user)}[plan_type]end目前如果我传入“bar”作为plan_type,所有方法都会运行,我怎么能只运行plan_is_bar方法呢? 最佳答案 这个变体怎么样?defmethod

  8. ruby - 无法在 Ruby 中将 ffmpeg 作为子进程运行 - 2

    我正在尝试使用以下代码通过将ffmpeg实用程序作为子进程运行并获取其输出并解析它来确定视频分辨率:IO.popen'ffmpeg-i'+path_to_filedo|ffmpegIO|#myparsegoeshereend...但是ffmpeg输出仍然连接到标准输出并且ffmepgIO.readlines是空的。ffmpeg实用程序是否需要一些特殊处理?或者还有其他方法可以获得ffmpeg输出吗?我在WinXP和FedoraLinux下测试了这段代码-结果是一样的。 最佳答案 要跟进mouviciel的评论,您需要使用类似pope

  9. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  10. ruby - 在好的 Ruby 代码中没有注释是否被认为是可以接受的? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭5年前。Improvethisquestion我审查了一些用Ruby编写的专业代码,没有发现任何评论。代码读起来相当清晰,但没有self记录。我应该期望专业编写的Ruby代码有注释吗?或者,是否有一些Ruby原则认为注释不是必需的?

随机推荐