Button in ContentView causes crash in MonoTouch ru

2019-02-18 13:05发布

问题:

My application worked fine in MT 3.0. Now when I upgraded. I am seeing errors when a button is in a ContentView. Crashes happen when the button is clicked. Code:

public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPa
    float width = tableView.Bounds.Width - 70;

    var cell = tableView.DequeueReusableCell(kCellIdentifier);
    //if (cell == null)
    //{
    cell = new UITableViewCell(UITableViewCellStyle.Subtitle, kCellIdentifier);
    // }

    var behavior = tvc.behaviors.ElementAt(indexPath.Row);
    cell.TextLabel.Text = behavior.Name;
    cell.TextLabel.Font = UIFont.BoldSystemFontOfSize(22f);
    cell.DetailTextLabel.Text = behavior.Definition;
    var view = UIButton.FromType(UIButtonType.Custom);
    view.Tag = indexPath.Row;
    view.SetImage(UIImage.FromBundle("Images/plus.png"), UIControlState.Normal);
    view.Frame = new RectangleF(width - 50, 10, 50, 50);

    view.TouchUpInside += IncrementBehavior;

    var label = new UILabel(new RectangleF(width - 80, 10, 50, 50));
    label.Text = behavior.CurrentCount.ToString();
    label.BackgroundColor = UIColor.Clear;
    label.Font = UIFont.BoldSystemFontOfSize(24f);
    cell.ContentView.AddSubview(view);
    cell.ContentView.AddSubview(label);
    //cell.BackgroundColor = UIColor.Clear;)

    return cell;
}

void IncrementBehavior(object sender, EventArgs e) {
    var button = (UIButton)sender;
    var tag = button.Tag;
    var behavior = tvc.behaviors[tag];

    var indexpath = NSIndexPath.FromRowSection(tag, 0);
    var newBehavior = Repository.GetBehavior(behavior.Id);
    newBehavior.CurrentCount++;
    Repository.Update(newBehavior);
    tvc.behaviors[tag] = newBehavior;


    tvc.TableView.ReloadRows(new[] { indexpath }, UITableViewRowAnimation.None);

}

I am getting these Errors interchangeably:

Name: NSInvalidArgumentException Reason: -[__NSCFSet BridgeSelector]: unrecognized selector sent to instance 0x5c3c570

AND

No constructor found for MonoTouch.UIKit.UIControlEventProxy::.ctor(System.IntPtr)

回答1:

Not sure if this is the problem, but when I upgraded to 4.0, I also got some random crashes. It turned out that the 4.0 GC is more aggressive, and that things I was previously getting away with were no longer kosher.

In particular, if I had a event handler assigned to a button, I needed to be sure the button was declared at the class level. If it was declared locally in the method, the GC would purge the reference when it went out of scope, and then later when the event handler tried to fire, it's reference was no longer there.

So try moving the declaration of your button outside of your method.