MonoTouch: NSInvalidArgumentException Причина: - [tableView:numberOfRowsInSection:]: нераспознанный селектор отправлен экземпляру 0x9940d70

Я понимаю, что уже задано несколько подобных вопросов, и я рассмотрел их все, но ни один из них не решил мою проблему.

У меня есть простой UIViewController, который содержит UISearchBar сверху и UITableView. Это основной код:

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();            
        searchBar.TextChanged += delegate {
            tableView.DataSource = new CodeSearchTableViewDataSource(searchBar.Text);
            tableView.ReloadData();
        };
        tableView.DataSource = new CodeSearchTableViewDataSource(searchBar.Text);
    }

public class CodeSearchTableViewDataSource : UITableViewDataSource
{
    static NSString CELL_ID = new NSString("MYID");

    public List<CodeItem> CodesFound { get; set; }

    public CodeSearchTableViewDataSource()
    {
    }
    public CodeSearchTableViewDataSource(string searchText)
    {
        CodesFound = CodeSearch.Instance.Find(searchText);          
    }
    public override int RowsInSection (UITableView tableView, int section)
    {
        return CodesFound.Count;
    }
    public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
    {
        UITableViewCell cell = tableView.DequeueReusableCell(CELL_ID);
        if (cell == null)
            cell = new UITableViewCell(UITableViewCellStyle.Default, CELL_ID);
        cell.TextLabel.Text = CodesFound[indexPath.Row].Id + " " + CodesFound[indexPath.Row].Desc;
        return cell;            
    }
}

У меня нет специального делегата. Чего я не понимаю, так это того, что когда это представление загружается в первый раз, таблица заполняется допустимым списком. Однако после того, как я ввожу символ в поле поиска, в таблицу отправляется новый список, и он вылетает.


person newman    schedule 26.11.2011    source источник


Ответы (1)


Нет (управляемой) ссылки на cell, который вы создаете в GetCell, когда он возвращается из метода. Таким образом, сборщик мусора (GC) может собирать его, когда захочет.

Подробнее см. в моем ответе (и его ссылках) на вопрос: Monotouch — Исключение нулевой ссылки на ячейку UITableview

person poupou    schedule 26.11.2011
comment
Poupou: Большое спасибо за ваш ответ, но я только что попытался кэшировать ячейки, и это не решило проблему — я все еще получаю то же исключение. - person newman; 27.11.2011
comment
Не уверен (трудно быть без полного теста), но я думаю, что это связано с тем фактом, что вы заменяете tableView.DataSource в событии TextChanged. Предыдущий, на который больше не ссылаются, может быть собран до того, как UITableView завершит свою работу с ним. Чтобы подтвердить это, сохраните ссылку на старый CodeSearchTableViewDataSource в поле и посмотрите, исчезнет ли ваша ошибка. - person poupou; 27.11.2011
comment
Хорошо, мне удалось решить мою проблему, просто воссоздав контроллер. Я считаю, что это ошибка MonoTouch, но я не знаю, как ее воспроизвести. - person newman; 27.11.2011
comment
poupou: В продолжение вашего комментария... Судя по моим тестам, GC клеток здесь определенно не проблема. Как только я заработал, он работает с кэшированием ячеек или без него. - person newman; 27.11.2011
comment
Это будет зависеть от вашего кода. Так что, скорее всего, все будет хорошо (как таковое), пока что-то не потребует обратного вызова в управляемом коде (например, если вы добавите кнопку и событие Clicked в свою ячейку). Просто имейте это в виду :) - person poupou; 27.11.2011