Я работаю над Xamarin.iOS. В TableView. Я связываю клетку кнопкой.
Для нажатия кнопки Я делаю событие «Подписаться и отписаться от ячейки» по коду ниже
cell.btn_Click.Tag = indexPath.Row;
cell.btn_Click.TouchUpInside -= BtnClickEvent;
cell.btn_Click.TouchUpInside += BtnClickEvent;
это не работает нормально, когда я снова вызываю API данных и устанавливаю TableView.
Объяснение:
Когда я открываю ViewController первый раз, кнопка ячейки щелкает событие огня 1 раз. И я открываю это во второй раз, когда это вызовет событие нажатия кнопки ячейки 2 раза Я использую верхний код для события кнопки подписки и отмены подписки, тогда почему она будет вызываться несколько раз.
с этой проблемой я сталкиваюсь в iOS 11.2
Первый путь:
Полный код исходного класса
class StockListSourceClass : UITableViewSource
{
private List<PacketAndPacketDetailItem> stockLists;
private List<string> serialNoList;
private UINavigationController navigationController;
public static event EventHandler BtnClickEvented;
public StockListSourceClass(List<PacketAndPacketDetailItem> stockLists, List<string> serialNolist, UINavigationController navigationController)
{
this.stockLists = stockLists;
this.serialNoList = serialNolist;
this.navigationController = navigationController;
}
public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
StockTableViewCell cell = tableView.DequeueReusableCell(StockTableViewCell.Key) as StockTableViewCell ?? StockTableViewCell.Create();
var item = stockLists[indexPath.Row];
if (serialNoList.Contains(item.SerialNo))
cell.BindData(item, true);
else
cell.BindData(item, false);
cell.SelectionStyle = UITableViewCellSelectionStyle.None;
cell.PreservesSuperviewLayoutMargins = false;
cell.SeparatorInset = UIEdgeInsets.Zero;
cell.LayoutMargins = UIEdgeInsets.Zero;
cell.SetNeedsLayout();
cell.LayoutIfNeeded();
cell.btn_Click.Tag = indexPath.Row;
cell.btn_Click.TouchUpInside -= BtnClickEvent;
cell.btn_Click.TouchUpInside += BtnClickEvent;
cell.btn_Click.TouchUpInside += (sender, e) => {
var imageName = ((UIButton)sender).TitleLabel.Text;
if (imageName.Equals("unchecked"))
{
((UIButton)sender).SetBackgroundImage(UIImage.FromBundle("checked"), UIControlState.Normal);
((UIButton)sender).TitleLabel.Text = "checked";
}
else
{
((UIButton)sender).SetBackgroundImage(UIImage.FromBundle("unchecked"), UIControlState.Normal);
((UIButton)sender).TitleLabel.Text = "unchecked";
}
};
return cell;
}
public void BtnClickEvent(object sender, EventArgs e)
{
var row = ((UIButton)sender).Tag;
MarketSheetViewController.RowNo = (int)row;
if (BtnClickEvented != null)
{
BtnClickEvented(stockLists[(int)row].SerialNo, EventArgs.Empty);
}
}
public override nint RowsInSection(UITableView tableview, nint section)
{
return stockLists.Count;
}
public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
var storyboard = UIStoryboard.FromName("Main", null);
var webController = storyboard.InstantiateViewController("PacketDetailViewController") as PacketDetailViewController;
webController.item = stockLists[indexPath.Row];
this.navigationController.PushViewController(webController, true);
}
}
Внутри ViewController Я использую это
StockListSourceClass.BtnClickEvented += (sender, e) =>
{
if (!(serialNoList.Contains(stockLists[RowNo].SerialNo)))
serialNoList.Add(stockLists[RowNo].SerialNo);
else
serialNoList.Remove(stockLists[RowNo].SerialNo);
SetUpperPanelData();
};
Второй способ
cell.btn_Click.TouchUpInside += (sender, e) => {
var imageName = ((UIButton)sender).TitleLabel.Text;
if (imageName.Equals("unchecked"))
{
((UIButton)sender).SetBackgroundImage(UIImage.FromBundle("checked"), UIControlState.Normal);
((UIButton)sender).TitleLabel.Text = "checked";
}
else
{
((UIButton)sender).SetBackgroundImage(UIImage.FromBundle("unchecked"), UIControlState.Normal);
((UIButton)sender).TitleLabel.Text = "unchecked";
}
var row = ((UIButton)sender).Tag;
MarketSheetViewController.RowNo = (int)row;
if (BtnClickEvented != null)
{
BtnClickEvented(stockLists[(int)row].SerialNo, EventArgs.Empty);
}
};
Но этот метод вызывается несколько раз, если я открываю ViewController во второй раз.