[VS-Mac]VisualStudio for Mac でSegue


VisualStudio for MacのSegueサンプルプログラム(Mac Cocoa)

GitHubに置いてあります TestSegue

Macのウィンドウ(View)切り替えはSegueを利用するようです。
はじめは何のことやらわからなかったのですが、Xamarinのサンプルプログラム等を解析してみて徐々にイメージがつかめてきたので忘れた場合のためにメモしておきます。

アプリの概要

  1. デバッグすると、MainViewが開きます。
  2. テキストフィールドに文字を入力してボタンをクリック。
  3. SubViewが開いて、テキストフィールドにMainViewの入力文字列がコピーされます。
  4. SubViewのテキストフィールドを変更してCloseボタンをクリック
  5. SubViewが閉じて、MainViewに入力データが渡されます。

実行画面

Modalの実行画面

01TestSegue10_runModal.gif

Sheetの実行画面

01TestSegue12_runSheet.gif

Popoverの実行画面

01TestSegue13_runPopover.gif

Show

  • Windowsの場合のモードレスフォームのようなもの。
  • SubViewを表示した状態でMainViewの操作が可能 01TestSegue14_runShow.gif

StoryBoardの編集

GitHubページを参照

コード

SubView.cs

  • 文字列の受け渡しのために「Arg1」文字列プロパティを追加
  • ViewWillAppear()をoverrideしてウィンドウ表示されるときにTextFieldにArg1を表示
  • 「SubButton_Click」アクションをSubView.designer.csからコピーしてコード実装
  • ViewControllerへの参照は「PresentingViewController」で可能(ParentViewControllerはnullでNG)
  • Segueのkindが「Show」の場合はnullが帰ってきて参照できないため、SubViewクラスにMainViewを保持するプロパティを作成すると可能
  • ViewControllerに文字列プロパティまたはpublic関数を作成するとこれが利用出来る
    public partial class SubView : NSViewController
    {
        public string Arg1 { get; set; }    //呼び出し元から受け取るデータ
        /*  //for Show                                    
        private ViewController vc;
        public ViewController ParentView { get { return vc; } set { vc = value; } }
        */
        public SubView(IntPtr handle) : base(handle)
        {
        }
        public override void ViewWillAppear()   //またはViewDidLoad()
        {
            base.ViewWillAppear();
            if (Arg1 != "")
                SubText.StringValue = Arg1;
            else
                SubText.StringValue = "no value from MainView";
        }
        partial void SubButton_Click(Foundation.NSObject sender)
        {
            //Showの場合下をコメントアウト
            ViewController vc = this.PresentingViewController as ViewController;    //呼び出し元のViewControllerインスタンス
            //vc.SubviewValue = SubText.StringValue;    //プロパティに渡す場合
            vc.UpdateLabel(SubText.StringValue);        //呼び出し元のpublic関数にアクセス可能
            this.View.Window.Close();                   //これで閉じることができる
         }
    }

ViewController.cs

  • Button_Clickイベント:PerformSegueでSegue1を呼び出す
  • PrepareForSegueが呼び出され、segue.IdentifierでSegueを識別できる
  • segue.DestinationControllerで新たに呼び出すViewControllerのインスタンスを参照できる
        partial void Button_Click(Foundation.NSObject sender)
        {
            //ボタンをドラッグしてSegueを作成した場合は不要
            //PerformSegueは個々のコントロールではなくViewControllerそのものを渡すようだ
            PerformSegue("Segue1", this);    //PrepareForSegueがここで呼ばれる
        }

        public override void PrepareForSegue(NSStoryboardSegue segue, NSObject sender)
        {
            base.PrepareForSegue(segue, sender);
            this.View.Window.Title = segue.Identifier;  //タイトル変えてみた
            SubView sub = segue.DestinationController as SubView;   //参照できる
            sub.Arg1 = TextField1.StringValue;      //プロパティにアクセス可能
            //sub.ParentView = this;  //for Show
        }
        //public string SubviewValue { get; set; }  //プロパティで受け取る場合
        public void UpdateLabel(string str)
        {
            TextField1.StringValue = str;
        }
        public override void ViewWillDisappear()
        {
            base.ViewWillDisappear();
            NSApplication.SharedApplication.Terminate(Self);
        }

開発環境

  • Visual Studio Community for Mac 2017 Ver.7.0.1
  • OSX ElCapitan
  • MacBook Pro Retina model

Reference: