Доступ к кнопкам компонента Xamarin (в частности, к iOS card.io компонент)

#ios #xamarin #card.io

#iOS #xamarin #card.io

Вопрос:

В card.io компонент (http://components.xamarin.com/view/cardioios ) имеет запасной экран, на котором есть кнопки «Отмена» и «Готово».

Ни один из которых на самом деле ничего не делает. Я предполагаю, что подписаться на событие и зависит от меня, однако события, на которое можно подписаться, нет.

Вот код:

 var paymentDelegate = new PaymentViewControllerDelegate();
var paymentViewController = new Card.IO.PaymentViewController(paymentDelegate);
paymentDelegate.OnScanCompleted  = (viewController, cardInfo) =>
{
    viewController.DismissViewController(true, null);

    if (cardInfo == null)
    {
    }
    else
    {
        new UIAlertView("Card Scanned!", cardInfo.CardNumber, null, "OK", null).Show();
    }
};

paymentViewController.AppToken = "app-token";

// Display the card.io interface
base.PresentViewController(paymentViewController, true, () => { });
 

В PaymentViewControllerDelegate есть метод, но я не могу понять, что с ним делать:

  public override void UserDidCancel(PaymentViewController paymentViewController);
 public override void UserDidProvideCreditCardInfo(CreditCardInfo cardInfo, PaymentViewController paymentViewController);
 

Я предполагаю, что проблема в том, что Компонент не предоставляет никаких событий для резервного просмотра.

Ответ №1:

Вам необходимо создать подкласс PaymentViewControllerDelegate :

 public class MyPaymentDelegate : PaymentViewControllerDelegate
{
    public MyPaymentDelegate ()
    {
    }
    public override void UserDidCancel (PaymentViewController paymentViewController)
    {
        // Implement on-cancel logic here...
        base.UserDidCancel (paymentViewController);
    }

    public override void UserDidProvideCreditCardInfo (CreditCardInfo cardInfo, PaymentViewController paymentViewController)
    {
        // Implement logic for credit card info provided here...
        base.UserDidProvideCreditCardInfo (cardInfo, paymentViewController);
    }
}
 

А затем предоставьте экземпляр этого класса в конструктор для Card.IO.PaymentViewController :

 var paymentDelegate = new MyPaymentDelegate();
var paymentViewController = new Card.IO.PaymentViewController(paymentDelegate);
 

Комментарии:

1. Я пробовал это, похоже, не сработало. Я не могу попасть в точки останова во время отладки и не могу отключить paymentViewController.. публичное переопределение аннулирует UserDidCancel(Card.IO.PaymentViewController paymentViewController) { paymentViewController. Отклонить ViewController(true, null); база. UserDidCancel(paymentViewController); }

Ответ №2:

Итак, я понял это, посмотрев на рабочий образец приложения и сравнив его с тем, что я сделал.

Все, что мне нужно было сделать, это расширить область действия переменных paymentDelegate и paymentViewController .

Ответ №3:

Если вы посмотрите на образец, вам действительно просто нужно подписаться на OnScanCompleted событие, которое вызывается в обоих случаях UserDidCancel (где CardInfo будет null) и UserDidProvideCreditCardInfo (где оно не будет null).

На самом деле, это код для привязки, поэтому вы можете видеть, что событие было создано как «помощник», чтобы вам не приходилось создавать собственную реализацию делегирования:

 namespace Card.IO
{
    public partial class PaymentViewControllerDelegate : BasePaymentViewControllerDelegate
    {
        public delegate void ScanCompleted(PaymentViewController viewController, CreditCardInfo cardInfo);
        public event ScanCompleted OnScanCompleted;

        public override void UserDidCancel (PaymentViewController paymentViewController)
        {
            var evt = OnScanCompleted;
            if (evt != null)
                evt(paymentViewController, null);
        }

        public override void UserDidProvideCreditCardInfo (CreditCardInfo cardInfo, PaymentViewController paymentViewController)
        {
            var evt = OnScanCompleted;
            if (evt != null)
                evt(paymentViewController, cardInfo);
        }
    }
}
 

Если вы все еще действительно хотите реализовать делегат самостоятельно, BasePaymentViewController вместо этого создайте подкласс, однако я не думаю, что вам действительно нужно создавать свой собственный подкласс…

Надеюсь, это поможет!

Комментарии:

1. Также вы говорите о резервном представлении, в котором есть кнопка отмены… При запуске на устройстве здесь я не вижу кнопки отмены в резервном представлении, вы можете просто нажать кнопку, чтобы вернуться назад. Вы просто используете старое устройство, которое запускается в этом резервном представлении? Мне трудно понять, в чем проблема…