【问题标题】:iOS TableView button is being called multiple timesiOS TableView 按钮被多次调用
【发布时间】:2017-02-21 02:13:17
【问题描述】:

我有一个带有自定义 UITableViewCell 的 TableView。在每个单元格中,我有多个按钮,当向下和向上滚动后单击任何按钮时,它会在我向下和向上滚动多次时调用它自己。

我已阅读并研究了解决方案,但尚未找到解决方案。

我知道问题是单元格被重复使用,这就是为什么按钮被多次调用但我找不到阻止它的方法。

我通过代码添加了控制台写入行语句,而 MoveToWindow 中的 else 部分永远不会被调用。这可能是原因吗?

解决方案的研究资料:

my code is calling twice the btndelete method in uitableview

UIButton click event getting called multiple times inside custom UITableViewCell

我的代码:

namespace Class.iOS
{
    public partial class CustomCell : UITableViewCell
    {
        public static readonly NSString Key = new NSString ("CustomCell");
        public static readonly UINib Nib;
        public int Row { get; set; }
        public event EventHandler LikeButtonPressed;

        private void OnLikeButtonPressed()
        {
            if (LikeButtonPressed != null)
            {
                LikeButtonPressed(this, EventArgs.Empty);
            }
        }

        public override void MovedToWindow()
        {
            if (Window != null)
            {
                btnAdd.TouchUpInside += HandleLikeButtonPressed;
            }
            else
            {
                btnAdd.TouchUpInside -= HandleLikeButtonPressed;
            }
        }

        private void HandleLikeButtonPressed(object sender, EventArgs e)
        {
            OnLikeButtonPressed();
        }

        static CustomCell ()
        {
            Nib = UINib.FromName ("CustomCell", NSBundle.MainBundle);
        }

        public CustomCell ()
        {           
        }

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

        public void UpdateCell (string Name, int number)
        {
            // some code
        }

        public class TableSource : UITableViewSource
        {           
            public override nint RowsInSection (UITableView tableview, nint section)
            {
                return 8;
            }

            private void HandleLikeButtonPressed(object sender, EventArgs e)
            {
                var cell = (CustomCell)sender;
                var row = cell.Row;

                switch (row) 
                {
                case 0:
                    cell.label.Text = ""
                    break;
                case 1:
                    cell.label.Text = ""
                    break;
                }
            }
            public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
            {
                var cell = tableView.DequeueReusableCell (CustomCell.Key) as CustomCell;
                cell.Row = indexPath.Row;

                if (cell == null) 
                {
                    cell = new CustomCell ();
                    var views = NSBundle.MainBundle.LoadNib("CustomCell", cell, null);
                    cell.LikeButtonPressed += HandleLikeButtonPressed;
                    cell = Runtime.GetNSObject( views.ValueAt(0) ) as CustomCell;

                }

                cell.UpdateCell 
                (
                    // some code
                );

                return cell;
            }
        }
    }
}

【问题讨论】:

    标签: c# ios uitableview xamarin xamarin.ios


    【解决方案1】:

    单元格在 iOS 中被重用,因此您需要确保在重用单元格时正确地解开处理程序并重置状态。你可以这样做:

    public partial class CustomCell : UITableViewCell {
    
    EventHandler _likeButtonHandler;
    
    public static readonly NSString Key = new NSString (typeof(CustomCell).Name);
    public static readonly UINib Nib = UINib.FromName (typeof(CustomCell).Name, NSBundle.MainBundle);
    
    public CustomCell ()
    {
    
    }
    
    public CustomCell (IntPtr handle) : base (handle)
    {
    }
    
    public override void PrepareForReuse ()
    {
        LikeButton.TouchUpInside -= _likeButtonHandler;
        _likeButtonHandler = null;
    
        base.PrepareForReuse ();
    }
    
    public void SetupCell (int row, string Name, EventHandler likeBtnHandler)
    {
        _likeButtonHandler = likeBtnHandler;
    
        LikeButton.TouchUpInside += _likeButtonHandler;
        LikeButton.Tag = row;
    
        NameLabel.Text = Name;
        RowLabel.Text = row.ToString ();
    }
    

    请注意,我取消了 PrepareForReuse 覆盖中的事件处理程序。这是清理和重置单元以供重用的正确位置。你不应该使用MovedToWindow()

    那么您的GetCell 方法将如下所示:

    public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
    {
        var cell = tableView.DequeueReusableCell (CustomCell.Key) as CustomCell ?? new CustomCell ();
    
        cell.SetupCell (indexPath.Row, _fruits [indexPath.Row], _likeButtonHandler);
    
        return cell;
    }
    

    _likeButtonHandler 是一个简单的EventHandler

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 2015-11-22
      • 2018-05-22
      • 2012-12-13
      • 1970-01-01
      • 2015-02-28
      相关资源
      最近更新 更多