【问题标题】:Call method in UITableViewController from custom UITableViewController in Xamarin从 Xamarin 中的自定义 UITableViewController 调用 UITableViewController 中的方法
【发布时间】:2015-09-09 21:59:01
【问题描述】:

在 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
        };
    }
}

【问题讨论】:

    标签: ios uitableview xamarin xamarin.ios custom-cell


    【解决方案1】:

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

    【讨论】:

    • 谢谢,是的,这是解决这个问题的好方法,但最后我想出了并实施通知。如果您使用通知,则需要更少的代码。
    【解决方案2】:

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

    基本上,您会声明一个协议(C# 用语中的接口)来通知观察类(在您的情况下是 UITableViewController 实例),例如

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

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

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

    【讨论】:

      【解决方案3】:

      在 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();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-27
        • 2013-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多