2015-09-09 2 views
1

В UITableViewController У меня есть метод, который обновляет нижнюю панель инструментов, отображающую общую цену.Вызов метода в UITableViewController из пользовательского UITableViewController в Xamarin

 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, когда был нажат stepper, поэтому я смогу обновить свой нижний текст панели инструментов.

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

ответ

0

В CartCell я добавил NSNotificationCenter.DefaultCenter.PostNotificationName («ValueDidChanged», это);

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

У меня был подобный случай, когда мне нужна была такая функциональность. Я сделал это, чтобы добавить событие в ячейку и использовать его в моем UITableViewSource, который имеет ссылку на контроллер.

+0

Спасибо, да, что это хороший способ решения этой проблемы, но наконец, я выясняю и внедряю уведомления. Если вы используете уведомления, вам нужно меньше кода. – Djonkwt

0

Если вы хотите поддерживать iOS, вы должны использовать шаблон делегата iOS (см. Раздел на странице Events, Delegates and Protocols на сайте Xamarin).

В принципе, вы должны объявить протокол (интерфейс на языке C#), чтобы уведомить класс наблюдения (в вашем случае экземпляр UITableViewController), например.

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

Слабая ссылка на делегат должен быть сохранен в своем классе наблюдений, которые экземпляр CartCell может взаимодействовать с.

Это было бы так же просто, как реализовать интерфейс в экземпляре UITableViewController и действовать соответственно после действия. Это похоже на событие C# (которое, кстати, является еще одним вариантом, который вы могли бы использовать, когда вы определяете событие в классе CartCell и привязываете его к событию касания на Stepper).