Кнопка в ContentView вызывает сбой во время выполнения MonoTouch. Ошибка в Monotouch 4.0? - PullRequest
3 голосов
/ 18 мая 2011

Мое приложение отлично работало в MT 3.0. Теперь, когда я обновился. Я вижу ошибки, когда кнопка находится в ContentView. Сбои происходят при нажатии кнопки. Код:

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);

}

Я получаю эти ошибки взаимозаменяемо:

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

И

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

1 Ответ

10 голосов
/ 18 мая 2011

Не уверен, что это проблема, но когда я обновился до 4.0, я также получил несколько случайных сбоев. Оказалось, что 4.0 GC более агрессивен, и то, с чем я раньше справлялся, уже не было кошерным.

В частности, если мне был назначен обработчик события для кнопки, мне нужно было убедиться, что кнопка была объявлена ​​на уровне класса. Если он был объявлен локально в методе, GC очистит ссылку, когда она выйдет из области видимости, а затем позже, когда обработчик события попытается запустить, его ссылка больше не будет.

Поэтому попробуйте переместить объявление вашей кнопки за пределы вашего метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...