0

card.io 组件 ( http://components.xamarin.com/view/cardioios ) 有一个后备屏幕,上面有一个 Cancel 和一个 Done 按钮。

两者实际上都没有做任何事情。我认为订阅和事件取决于我,但是,没有要订阅的事件。

这是代码:

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);

我猜问题是组件没有为后备视图公开任何事件。

4

3 回答 3

0

您需要子类化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);
于 2014-06-22T12:05:31.033 回答
0

如果您查看示例,您实际上只需要订阅在(cardInfo 将为空)和(不为空)OnScanCompleted两种情况下调用的事件。UserDidCancelUserDidProvideCreditCardInfo

事实上,这是绑定的代码,因此您可以看到 Event 是作为“助手”制作的,因此您不必制作自己的委托实现:

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请改为子类,但是我认为您真的不需要创建自己的子类...

希望这会有所帮助!

于 2014-06-23T18:19:22.280 回答
0

因此,我通过查看工作示例应用程序并将其与我所做的比较来解决这个问题。

我所要做的就是扩大 paymentDelegate 和 paymentViewController 变量的范围。

于 2014-06-23T16:41:29.903 回答