示例#1
0
        public NewCommentViewController(Func <string, Task> saveAction)
        {
            ViewModel = new NewCommentViewModel(saveAction);

            Title = "New Comment";
            EdgesForExtendedLayout = UIRectEdge.None;

            var discardButton = new UIBarButtonItem {
                Image = Images.Buttons.Cancel
            };
            var doneButton = new UIBarButtonItem(UIBarButtonSystemItem.Save);

            NavigationItem.RightBarButtonItem = doneButton;
            NavigationItem.LeftBarButtonItem  = discardButton;

            _textView                  = new UITextView();
            _textView.Font             = UIFont.PreferredBody;
            _textView.AutoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth;

            // Work around an Apple bug in the UITextView that crashes
            if (ObjCRuntime.Runtime.Arch == ObjCRuntime.Arch.SIMULATOR)
            {
                _textView.AutocorrectionType = UITextAutocorrectionType.No;
            }

            OnActivation(d =>
            {
                discardButton
                .GetClickedObservable()
                .SelectUnit()
                .BindCommand(ViewModel.DiscardCommand)
                .AddTo(d);

                this.WhenAnyValue(x => x.ViewModel.DoneCommand.CanExecute)
                .Switch()
                .Subscribe(x => doneButton.Enabled = x)
                .AddTo(d);

                doneButton
                .GetClickedObservable()
                .Do(_ => _textView.ResignFirstResponder())
                .SelectUnit()
                .BindCommand(ViewModel.DoneCommand)
                .AddTo(d);

                _textView
                .GetChangedObservable()
                .Subscribe(x => ViewModel.Text = x)
                .AddTo(d);

                this.WhenAnyValue(x => x.ViewModel.Text)
                .Subscribe(x => _textView.Text = x)
                .AddTo(d);

                this.WhenAnyObservable(x => x.ViewModel.DismissCommand)
                .Select(_ => Unit.Default)
                .Subscribe(_dismissSubject)
                .AddTo(d);
            });
        }
        public ComposerViewController(Func <string, Task> doneAction)
        {
            Title = "New Comment";
            EdgesForExtendedLayout = UIRectEdge.None;

            var close = new UIBarButtonItem {
                Image = Images.Buttons.Cancel
            };

            NavigationItem.LeftBarButtonItem = close;
            _doneButton = new UIBarButtonItem(UIBarButtonSystemItem.Save);
            NavigationItem.RightBarButtonItem = _doneButton;

            TextView                  = new UITextView(ComputeComposerSize(CGRect.Empty));
            TextView.Font             = UIFont.PreferredBody;
            TextView.AutoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth;

            // Work around an Apple bug in the UITextView that crashes
            if (ObjCRuntime.Runtime.Arch == ObjCRuntime.Arch.SIMULATOR)
            {
                TextView.AutocorrectionType = UITextAutocorrectionType.No;
            }

            View.AddSubview(TextView);

            OnActivation(d =>
            {
                close
                .GetClickedObservable()
                .Select(_ => Unit.Default)
                .Subscribe(_dismissObservable)
                .AddTo(d);

                _doneButton
                .GetClickedObservable()
                .Subscribe(async _ =>
                {
                    TextView.ResignFirstResponder();
                    _doneButton.Enabled = false;
                    try
                    {
                        await doneAction(TextView.Text);
                        _dismissObservable.OnNext(Unit.Default);
                    }
                    catch (Exception e)
                    {
                        System.Diagnostics.Debug.WriteLine(e.Message + " - " + e.StackTrace);
                    }
                    finally
                    {
                        _doneButton.Enabled = true;
                    }
                })
                .AddTo(d);

                TextView
                .GetChangedObservable()
                .Subscribe(x => this.RaisePropertyChanged(nameof(Text)))
                .AddTo(d);


                this.WhenAnyValue(x => x.Text)
                .Select(x => x.Length > 0)
                .Subscribe(x => _doneButton.Enabled = x)
                .AddTo(d);
            });
        }