Reputation: 33880
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)
Upvotes: 3
Views: 2454
Reputation: 89082
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.
Upvotes: 10