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