[Xamarin.Mac] 프로젝트 내의 리소스 파일을 실행할 때 애플리케이션에서 읽기

하고 싶은 일


Xamarin.Mac로 만든 데스크톱 프로그램으로 프로젝트에서 준비한 설정과 템플릿 등 파일을 실행할 때 읽으려고 합니다.

배경·장면 사용


Xamarin.Mac에서 log4net을 사용하기 위해서 시작할 때 XML로 쓴 파일을 읽고 log4net에 건네줍니다.
또한 응용 프로그램이 간단한 웹 서버를 가지고 있을 때 템플릿 파일을 읽을 수 있도록 하려는 경우도 마찬가지로 이루어졌다.

절차.


이번에는 파일을 읽는 예로 프로젝트 내의 JSON 파일을 읽고 지난번에 작성한 표에 표시합니다.
이전 기사: Delegate 및 DataSource를 사용하는 TableView에 증분 검색 설치

파일 추가


읽은 JSON 파일을 만듭니다.
프로젝트 아래에 Resources라는 폴더가 있으며 여기에 파일을 추가합니다.파일 이름은 members입니다.제이슨으로서

members.json
{
  "members": [
    {
      "Name": "a2see",
      "TwitterId": "a2see"
    },
    {
      "Name": "うぇるち",
      "TwitterId": "welchi_"
    },
    {
      "Name": "想間ミレイ",
      "TwitterId": "zerovabi"
    },
    {
      "Name": "月見ねぎとろ",
      "TwitterId": "tukimi_negitoro"
    },
    {
      "Name": "創好リナ",
      "TwitterId": "TsukusuLina"
    },
    {
      "Name": "でんじぃ",
      "TwitterId": "den_oldman"
    },
    {
      "Name": "とりえ",
      "TwitterId": "trpla226"
    },
    {
      "Name": "なもなき",
      "TwitterId": "nam0naki"
    }
  ]
}

구성 구성 작업


해결 방안 창의 members.json 파일의 상하문 메뉴를 표시하고 "속성"을 누르십시오.

빌드 동작 드롭다운에서 EmbedResource를 선택합니다.
EmbedResource를 선택한 경우 리소스 ID에서 기본 리소스를 설정합니다.이것을 클립보드에 복사하세요.
이번 ID는 "tablesearch.Resources.members.json"입니다.

읽기 파일 처리 설명


이번에는 ViewController 생성 시 파일을 읽습니다.
Assiembly#GetManifestResourceStream()에 자원 ID를 전달하면 Stream으로 얻을 수 있습니다.
그런 다음 Stream을 문자열로 읽고 마지막으로 만든 디스플레이 처리를 위해 원하는 형식으로 변환합니다.
또 JSON의 퍼스에서는 뉴튼소프트를 누그get으로 진행한다.Json을 가져왔습니다.
ViewController.cs(해당되는 부분)
// Resource内のファイルを取得
var assm = Assembly.GetExecutingAssembly();
var membersStream = assm.GetManifestResourceStream("tablesearch.Resources.members.json");

// string型としてファイルの最後まで読み込む
var membersJson = new StreamReader(membersStream).ReadToEnd();

// 取得したJSONをList<Member>に変換
var membersJObj = JObject.Parse(membersJson);
var membersJArray = (JArray)membersJObj["members"];
Members = membersJArray
    .Select(jt => jt.ToObject<Member>())
    .ToList().AsReadOnly();
테이블에 JSON 파일의 내용을 표시할 수 있습니다.

컨디션


Mac OS X 10.15.6
Visual Studio for Mac Community 8.8.1(build 37)
Xamarin Mac 7.0.0.15
XCode Version 12.2

부록.


마지막 코드에 변경된 ViewController를 추가합니다.cs 파일의 모든 내용을 미리 공개합니다.
ViewController.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using AppKit;
using Foundation;
using Newtonsoft.Json.Linq;
namespace tablesearch
{
    public partial class ViewController : NSViewController
    {
        readonly MemberTableViewDataSource dataSource = new MemberTableViewDataSource();
        IReadOnlyCollection<Member> Members;
        public ViewController(IntPtr handle) : base(handle)
        {
            // Resource内のファイルを取得
            var assm = Assembly.GetExecutingAssembly();
            var membersStream = assm.GetManifestResourceStream("tablesearch.Resources.members.json");
            // string型としてファイルの最後まで読み込む
            var membersJson = new StreamReader(membersStream).ReadToEnd();
            // 取得したJSONをList<Member>に変換
            var membersJObj = JObject.Parse(membersJson);
            var membersJArray = (JArray)membersJObj["members"];
            Members = membersJArray
                .ToList()
                .Select(jt => jt.ToObject<Member>())
                .ToList()
                .AsReadOnly();
            dataSource.Members = new List<Member>(Members);
        }
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
            MemberTableView.DataSource = dataSource;
            MemberTableView.Delegate = new MemberTableViewDelegate(dataSource);
        }
        public override NSObject RepresentedObject
        {
            get
            {
                return base.RepresentedObject;
            }
            set
            {
                base.RepresentedObject = value;
                // Update the view, if already loaded.
            }
        }
        partial void KeywordChanged(NSObject sender)
        {
            var keyword = ((NSSearchField)sender).StringValue;
            dataSource.Members = Members
                .Where(member => member.Name.Contains(keyword))
                .ToList();
            MemberTableView.ReloadData();
        }
    }
    public class MemberTableViewDataSource : NSTableViewDataSource
    {
        public List<Member> Members { get; set; } = new List<Member>();
        public override nint GetRowCount(NSTableView tableView)
        {
            return Members.Count;
        }
    }
    public class MemberTableViewDelegate : NSTableViewDelegate
    {
        private const string CellIdentifier = "MemberCell";
        private MemberTableViewDataSource dataSource;
        public MemberTableViewDelegate(MemberTableViewDataSource dataSource)
        {
            this.dataSource = dataSource;
        }
        public override NSView GetViewForItem(NSTableView tableView,
            NSTableColumn tableColumn,
            nint row)
        {
            NSTextField view = (NSTextField)tableView.MakeView(CellIdentifier, this);
            if (view == null)
            {
                view = new NSTextField();
                view.Identifier = CellIdentifier;
                view.BackgroundColor = NSColor.Clear;
                view.Bordered = false;
                view.Editable = false;
                view.Selectable = false;
            }
            var member = dataSource.Members[(int)row];
            switch(tableColumn.Title)
            {
                case "Name":
                    view.StringValue = member.Name;
                    break;
                case "Twitter ID":
                    view.StringValue = member.TwitterId;
                    break;
            }
            return view;
        }
    }
}
그리고 뉴튼소프트.Json이 분류화할 때 Member 등급의 정의도 변경되었기 때문에 변경된 코드는 다음과 같다.
Member.cs
namespace tablesearch
{
    public class Member
    {
        public string Name;
        public string TwitterId;
        public Member(string name, string twitterId)
        {
            Name = name;
            TwitterId = twitterId;
        }
    }
}

좋은 웹페이지 즐겨찾기