В моем TreeView
есть вспомогательная функция, которая выглядит примерно так:
Card GetCardFromPath (TreePath path)
{
TreeIter iter;
if (path == null || !Model.GetIter (out iter, path))
return null;
if ((Model as TreeModelSort).IterIsValid (iter))
return (Card) Model.GetValue (iter, 0);
return null;
}
В большинстве случаев это работает без ошибок. Но когда он вызывается непосредственно после изменения модели, строка 8 дает мне следующие ошибки времени выполнения Gtk:
[Fatal 16:53:02.448] [Gtk] gtk_list_store_get_value: assertion `VALID_ITER (iter, list_store)' failed
[Fatal 16:53:02.449] [GLib-GObject] g_value_unset: assertion `G_IS_VALUE (value)' failed
Насколько я могу судить, мне даже не нужно проверять IterIsValid
, потому что я уже проверяю возвращаемое значение Model.GetIter
. Тем не менее, как VALID_ITER
может потерпеть неудачу в функции, которая вызывается, только если IterIsValid
возвращает true
?
Если это имеет значение, модель представляет собой TreeModelSort
, которая сортирует TreeModelFilter
, которая фильтрует ListStore
. Ошибка возникает, когда GetCardFromPath
вызывается из HandleSelectionChanged
, когда из ListStore было только что удалено несколько строк. Похоже, что это не мешает работать должным образом, но наличие каскада ошибок при удалении нескольких строк на самом деле не идеально.