Indexed TableViews no se muestra después de la actualización a MT 4.0

Después de actualizar a MT 4.0, mis TableViews que anteriormente mostraban índices en el borde derecho ya no funcionan. La vista de tabla aún se muestra en secciones y funciona correctamente, pero el índice no se muestra.

Tengo estos tres methods definidos en mi UITableViewSource, y los tres parecen estar funcionando:

public override string[] SectionIndexTitles(UITableView tableView) public override int SectionFor(UITableView tableView, string Title, int atIndex) public override string TitleForHeader(UITableView tableView, int section) 

¿Hay alguien más que esté teniendo este problema? ¿Esto es un error con MT 4.0?

Este es un error conocido .

Parece que UITableView no retiene la matriz devuelta, puede usar lo siguiente para solucionar este problema mientras lo investigamos más:

 NSArray array; [Export ("sectionIndexTitlesForTableView:")] public NSArray SectionTitles (UITableView tableview) { if (array == null) { string[] titles = new string[RowsInSection(tableview, 0)]; for (int index = 0; index < titles.Length; index++) titles[index] = index.ToString(); array = NSArray.FromStrings (titles); } return array; } 

Esto me mostraba numbers (índice para cada elemento de la sección 0 (como una letra del índice), así que descubrí que debe cambiar esto a:

  NSArray array; [Export ("sectionIndexTitlesForTableView:")] public NSArray SectionTitles (UITableView tableview) { if (array == null) { array = NSArray.FromStrings (SectionIndexTitles(tableview)); } return array; } 

A todas las personas que no consiguen que la solución funcione correctamente:

Para mí fue porque dejé el método de anulación de MonoTouch SectionIndexTitles allí, tan pronto como lo eliminé (o en mi caso lo cambió el nombre para que se pueda llamar desde la solución), funcionó como se describe 🙂

Conseguir el mismo problema, pero la solución anterior no funcionó, estoy seguro de que probablemente sea algo simple que estoy haciendo mal. Los siguientes methods son parte de UITableViewSource. Todo funciona como estaba antes de MT 4.0, sin embargo, el índice textual no aparece. La salida de debugging listda debajo del código muestra que no se llama a SectionTitles. ¿Alguna idea sobre cómo esto difiere de la solución anterior y cómo hacerlo funcionar? Encantado de comenzar un nuevo hilo en esto, pero pensé que podría ser útil tener más información sobre esta pregunta en su lugar.

  NSArray array; [Export ("sectionIndexTitlesForTableView:")] public NSArray SectionTitles(UITableView tableview) { Debug.WriteLine("SectionTitles"); if (array == null) { array = NSArray.FromStrings(SectionIndexTitles(tableview)); } return array; } public override string[] SectionIndexTitles(UITableView tableView) { Debug.WriteLine("SectionIndexTitles"); var sectionIndexTitles = Root.Sections.Select(section => section.IndexTitle ?? string.Empty); var applySectionIndexTitles = sectionIndexTitles.Any (sectionIndexTitle => !string.IsNullOrEmpty (sectionIndexTitle)); foreach (string s in sectionIndexTitles) { Debug.WriteLine(s); } Debug.WriteLine("applySectionIndexTitles = " + applySectionIndexTitles); return applySectionIndexTitles ? sectionIndexTitles.ToArray () : null; } 

Salida de debugging:

SectionIndexTitles

UN

segundo

do

re

mi

F

GRAMO

MARIDO

J

K

L

METRO

norte

O

PAG

R

S

T

W

applySectionIndexTitles = cierto

Wow, las respuestas aquí son extremadamente engañosas. ¿Dónde empiezo?

Primero, ¿por qué los ejemplos usan un respaldo NSArray? ¿Por qué no una cadena [] para los datos de respaldo? El hecho de que el método devuelva un NSArray no significa que tenga que respaldarlo con un NSArray. Yikes. ¿Por qué utilizarías un NSArray a less que tengas que hacerlo? No tienes que hacerlo aquí.

En segundo lugar, de manera realist, siempre almaceno mis títulos de índice en una secuencia de respaldo []. Eso es un uso normal, diría yo. ¿Por qué no harías eso de todos modos? Las respuestas aquí hacen que parezca que es un caso especial o algo en lo que tienes que savelo. Por lo que sé, siempre eres responsable de hacerlo. Y otro ejemplo que confía en las células para get datos … ¿Por qué diablos? Si no puede simplemente utilizar una matriz, obtenga una idea de que su matriz está fuera del scope o algo así.

Además, algunas personas mencionaron no anular como lo haría normalmente. Ummm … no lo sé. Eso contradice completamente todo el código monotouch que he visto. He visto muchos ejemplos de ambos y tiene sentido. Mira algunos de los constructores de la plantilla UIViewController. Las llamadas internas que hacen reference explícita a los selectores necesitarán el selector. Normalmente no necesitarías uno, pero en este caso aparentemente algo interno se rompe al hacer reference al selector. Eso NO es una razón para anular su anulación como lo haría normalmente. Aún necesita anularlo en caso de que tenga alguna llamada externa que proviene de su propio código administrado. Deberías absolutamente anularlo. A less que siempre haga reference explícita a los selectores en SU ​​código … entonces manténgalo anulado.

De todos modos, mucho de esto es mi comprensión monotocable general y podría estar equivocado. Quiero decir, no sé … en serio no estoy tratando de criticar. Solo tuve que comentar porque me parece que hay MUCHA información errónea en este hilo y espero que esta publicación ayude a alguien que podría estar siendo desinformado.