从 Xamarin 中的自定义 UITableViewController 调用 UITableViewController 中的方法

Call method in UITableViewController from custom UITableViewController in Xamarin

在 UITableViewController 中,我有一个方法可以更新显示总价的底部工具栏。

        public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
        {
            var cell = (CartCell)tableView.DequeueReusableCell(CellIdentifier, indexPath);
            if (cell == null)
            {
                cell = new CartCell(this.Handle);
            }
            cell.UpdateCartCell(tableItems[indexPath.Row]);
            return cell;
        }

在 UITableViewCell 中,我有一个 UIStepper。我不知道如何在按下步进器时调用 UITableViewController 中的方法,这样我就可以更新底部工具栏文本。

partial class CartCell : UITableViewCell
{
    int quantity;
    float cartItemTotal;

    public CartCell(IntPtr handle)
        : base(handle)
    {
    }

    public void UpdateCartCell(CartItem cartItem)
    {
        quantity = cartItem.Quantity;
        cartItemTotal = cartItem.thisTotal;

        productName.Text = cartItem.Name;
        productDescription.Text = cartItem.Description;
        productQuantyty.Text = quantity.ToString();
        productPrice.Text = cartItem.Price;
        stepper.Value = quantity;
        stepper.MinimumValue = 1;
        stepper.ValueChanged += (o, s) =>
        {
            double value = stepper.Value;

            #region **** QTY Remove****
            if (value < quantity)
            { ... }
            #endregion

            #region **** QTY Add****
            if (value > quantity)
            { ... }
            #endregion
        };
    }
}

我有一个类似的案例,我需要这样的功能。我所做的是向单元格添加一个事件并在我的 UITableViewSource 中使用它,它引用了控制器。

如果您想保持 iOS 的感觉,您可以使用 iOS 委托模式(请参阅 Xamarin 网站上有关 Events, Delegates and Protocols 的部分)。

基本上,您将声明一个协议(C# 中的接口)来通知观察者 class(在您的例子中是 UITableViewController 实例)例如

public interface CartCellStepperDelegate
{
    void cartCellValueChanged(int value);
}

应该在您的观察 class 中维护对委托的弱引用,CartCell 的实例可以与之通信。

这就像在 UITableViewController 实例中实现接口并在操作后进行相应操作一样简单。这有点类似于 C# 事件(顺便说一下,这是您可以在 CartCell class 中定义事件并将其绑定到 Stepper 上的触摸事件的地方使用的另一个选项)。

我在 CartCell 中添加了 NSNotificationCenter.DefaultCenter.PostNotificationName("ValueDidChanged", this);

public void UpdateCartCell(CartItem cartItem)
{
     stepper.ValueChanged += (o, s) =>
    {
        double value = stepper.Value;

        #region **** QTY Remove****
        if (value < quantity)
        { ... }
        #endregion

        #region **** QTY Add****
        if (value > quantity)
        { ... }
        #endregion
        NSNotificationCenter.DefaultCenter.PostNotificationName("ValueDidChanged", this);
    };
}

在 UITableViewController 中我正在监听通知:

     observer = NSNotificationCenter.DefaultCenter.AddObserver((NSString)"ValueDidChanged", UpdateSettings);

并调用更新总数的方法:

    void UpdateSettings(NSNotification obj)
    {
        UpdateTotal();
    }