Skip to content

1_ Xamarin.iOS

Yoshito Tabuchi edited this page Jun 8, 2018 · 4 revisions

PhoneTranslator.cs

using System;
using System.Text;

namespace Core
{
    public static class PhonewordTranslator
    {
        public static string ToNumber(string raw)
        {
            if (string.IsNullOrWhiteSpace(raw))
                return "";
            else
                raw = raw.ToUpperInvariant();
            var newNumber = new StringBuilder();
            foreach (var c in raw)
            {
                if (" -0123456789".Contains(c))
                    newNumber.Append(c);
                else {
                    var result = TranslateToNumber(c);
                    if (result != null)
                        newNumber.Append(result);
                }
                // 数字以外の文字はスキップします。
            }
            return newNumber.ToString();
        }
        static bool Contains (this string keyString, char c)
        {
            return keyString.IndexOf(c) >= 0;
        }
        static int? TranslateToNumber(char c)
        {
            if ("ABC".Contains(c))
                return 2;
            else if ("DEF".Contains(c))
                return 3;
            else if ("GHI".Contains(c))
                return 4;
            else if ("JKL".Contains(c))
                return 5;
            else if ("MNO".Contains(c))
                return 6;
            else if ("PQRS".Contains(c))
                return 7;
            else if ("TUV".Contains(c))
                return 8;
            else if ("WXYZ".Contains(c))
                return 9;
            return null;
        }
    }
}

ViewController.cs

TranslateButton の処理を追加:

string translatedNumber = "";
TranslateButton.TouchUpInside += (object sender, EventArgs e) =>
{
    // PhoneTranslator.csを使用してテキストから電話番号に変換します
    translatedNumber = Core.PhonewordTranslator.ToNumber(PhoneNumberText.Text);
    // TextFieldがタップされたらキーボードをDismissします
    PhoneNumberText.ResignFirstResponder();

    if (translatedNumber == "")
    {
        CallButton.SetTitle("Call", UIControlState.Normal);
        CallButton.Enabled = false;
    }
    else
    {
        CallButton.SetTitle("Call " + translatedNumber, UIControlState.Normal);
        CallButton.Enabled = true;
    }
};

CallButton の処理を追加:

CallButton.TouchUpInside += (object sender, EventArgs e) =>
{
    var url = new NSUrl("tel:" + translatedNumber);
    // 標準の電話アプリを呼び出すためにtel:のプリフィックスでURLハンドラーを使用します
    // できない場合はAlertViewを呼び出します。
    if (!UIApplication.SharedApplication.OpenUrl(url))
    {
        var av = new UIAlertView("Not supported",
            "Scheme 'tel:' is not supported on this device",
            null,
            "OK",
            null);
        av.Show();
    }
};

ViewController.cs (現在の完成形)

using Foundation;
using System;
using UIKit;

namespace Phoneword.iOS
{
    public partial class ViewController : UIViewController
    {
        public ViewController(IntPtr handle) : base(handle)
        {
        }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            string translatedNumber = "";
            TranslateButton.TouchUpInside += (object sender, EventArgs e) =>
            {
                // PhoneTranslator.csを使用してテキストから電話番号に変換します
                translatedNumber = Core.PhonewordTranslator.ToNumber(PhoneNumberText.Text);
                // TextFieldがタップされたらキーボードをDismissします
                PhoneNumberText.ResignFirstResponder();

                if (translatedNumber == "")
                {
                    CallButton.SetTitle("Call", UIControlState.Normal);
                    CallButton.Enabled = false;
                }
                else
                {
                    CallButton.SetTitle("Call " + translatedNumber, UIControlState.Normal);
                    CallButton.Enabled = true;
                }
            };

            CallButton.TouchUpInside += (object sender, EventArgs e) =>
            {
                var url = new NSUrl("tel:" + translatedNumber);
                // 標準の電話アプリを呼び出すためにtel:のプリフィックスでURLハンドラーを使用します
                // できない場合はAlertViewを呼び出します。
                if (!UIApplication.SharedApplication.OpenUrl(url))
                {
                    var av = new UIAlertView("Not supported",
                      "Scheme 'tel:' is not supported on this device",
                      null,
                      "OK",
                      null);
                    av.Show();
                }
            };
        }

        public override void DidReceiveMemoryWarning()
        {
            base.DidReceiveMemoryWarning();
            // Release any cached data, images, etc that aren't in use.		
        }
    }
}

CallHistoryController.cs

using System;
using Foundation;
using UIKit;
using System.Collections.Generic;

namespace Phoneword.iOS
{
    public partial class CallHistoryController : UITableViewController
    {
        public List<string> PhoneNumbers { get; set; }
        static NSString callHistoryCellId = new NSString ("CallHistoryCell");
        public CallHistoryController (IntPtr handle) : base (handle)
        {
            TableView.RegisterClassForCellReuse (typeof(UITableViewCell), callHistoryCellId);
            TableView.Source = new CallHistoryDataSource (this);
            PhoneNumbers = new List<string> ();
        }
        class CallHistoryDataSource : UITableViewSource
        {
            CallHistoryController controller;
            public CallHistoryDataSource (CallHistoryController controller)
            {
                this.controller = controller;
            }
            // テーブルの各セクションの行数を返します
            public override nint RowsInSection (UITableView tableView, nint section)
            {
                return controller.PhoneNumbers.Count;
            }
            // NSIndexPathのRowプロパティで指定された行のテーブルセルを返します
            // このメソッドは、表の各行を挿入するために複数回呼び出されます
            // このメソッドは自動的に画面外にスクロールしたCellを使用または必要に応じて新しいものを作成します
            public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
            {
                var cell = tableView.DequeueReusableCell (CallHistoryController.callHistoryCellId);
                int row = indexPath.Row;
                cell.TextLabel.Text = controller.PhoneNumbers[row];
                return cell;
            }
        }
    }
}

ViewController.cs

using 追加

using System.Collections.Generic;

クラス変数追加

// translatedNumberをViewDidLoad()から移動します
string translatedNumber = "";
public List<string> PhoneNumbers { get; set; }

コンストラクター内でList初期化

// Call History画面用に電話番号のListを初期化します
PhoneNumbers = new List<string>();

CallButton編集

// 変換した電話番号をPhoneNumbersに追加します
PhoneNumbers.Add(translatedNumber);
var alert = UIAlertController.Create("Not supported", "Scheme 'tel:' is not supported on this device", UIAlertControllerStyle.Alert);
alert.AddAction(UIAlertAction.Create ("Ok", UIAlertActionStyle.Default, null));
PresentViewController(alert, true, null);

PrepareForSegue追加

public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender)
{
    base.PrepareForSegue(segue, sender);
    // set the View Controller that’s powering the screen we’re
    // transitioning to
    var callHistoryContoller = segue.DestinationViewController as CallHistoryController;
    //set the Table View Controller’s list of phone numbers to the
    // list of dialed phone numbers
    if (callHistoryContoller != null)
    {
        callHistoryContoller.PhoneNumbers = PhoneNumbers;
    }
}

ViewController.cs(完成形)

using Foundation;
using System;
using UIKit;
using System.Collections.Generic;

namespace Phoneword.iOS
{
    public partial class ViewController : UIViewController
    {
        // translatedNumberをViewDidLoad()から移動します
        string translatedNumber = "";
        public List<string> PhoneNumbers { get; set; }

        public ViewController(IntPtr handle) : base(handle)
        {
            // Call History画面用に電話番号のListを初期化します
            PhoneNumbers = new List<string>();
        }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            TranslateButton.TouchUpInside += (object sender, EventArgs e) =>
            {
                // PhoneTranslator.csを使用してテキストから電話番号に変換します
                translatedNumber = Core.PhonewordTranslator.ToNumber(PhoneNumberText.Text);
                // TextFieldがタップされたらキーボードをDismissします
                PhoneNumberText.ResignFirstResponder();

                if (translatedNumber == "")
                {
                    CallButton.SetTitle("Call", UIControlState.Normal);
                    CallButton.Enabled = false;
                }
                else
                {
                    CallButton.SetTitle("Call " + translatedNumber, UIControlState.Normal);
                    CallButton.Enabled = true;
                }
            };

            CallButton.TouchUpInside += (object sender, EventArgs e) =>
            {
                // 変換した電話番号をPhoneNumbersに追加します
                PhoneNumbers.Add(translatedNumber);

                var url = new NSUrl("tel:" + translatedNumber);
                // 標準の電話アプリを呼び出すためにtel:のプリフィックスでURLハンドラーを使用します
                // できない場合はAlertViewを呼び出します。
                if (!UIApplication.SharedApplication.OpenUrl(url))
                {
                    var alert = UIAlertController.Create("Not supported", "Scheme 'tel:' is not supported on this device", UIAlertControllerStyle.Alert);
                    alert.AddAction(UIAlertAction.Create("Ok", UIAlertActionStyle.Default, null));
                    PresentViewController(alert, true, null);
                }
            };
        }

        public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender)
        {
            base.PrepareForSegue(segue, sender);
            // set the View Controller that’s powering the screen we’re
            // transitioning to
            var callHistoryContoller = segue.DestinationViewController as CallHistoryController;
            //set the Table View Controller’s list of phone numbers to the
            // list of dialed phone numbers
            if (callHistoryContoller != null)
            {
                callHistoryContoller.PhoneNumbers = PhoneNumbers;
            }
        }

        public override void DidReceiveMemoryWarning()
        {
            base.DidReceiveMemoryWarning();
            // Release any cached data, images, etc that aren't in use.		
        }
    }
}