Индексированные табличные представления не отображаются после обновления до MT 4.0

#ios #uitableview #xamarin.ios

#iOS #uitableview #xamarin.ios

Вопрос:

После обновления до MT 4.0 мои табличные представления, которые ранее отображали индексы на правой границе, больше не работают. Просмотр таблиц по-прежнему отображается в разделах и работает должным образом, но индекс не отображается.

У меня есть эти три метода, определенные в моем UITableViewSource, и все три, похоже, работают:

 public override string[] SectionIndexTitles(UITableView tableView)

public override int SectionFor(UITableView tableView, string Title, int atIndex)

public override string TitleForHeader(UITableView tableView, int section)
  

У кого-нибудь еще есть эта проблема? Это ошибка с MT 4.0?

Ответ №1:

Это известная ошибка.

Похоже, что UITableView не сохраняет возвращенный массив, вы можете использовать следующее, чтобы обойти эту проблему, пока мы исследуем ее дальше:

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

Комментарии:

1. Просто чтобы уточнить, вы добавили это в UITableViewSource? Однако, имея ту же проблему, не удается заставить это исправление работать (или предложение ниже).

2. Вы пытаетесь заставить индекс отображаться в первый раз или пытаетесь исправить индекс, который ранее работал, но теперь не работает в MT 4.0?

3. Приведенное выше исправление сработало для меня. Обязательно убедитесь, что в ваших tableViews вызывается метод SectionTitles — мой первый проход к нему не сработал, потому что я пропустил «:» в конце атрибута экспорта, поэтому мой метод никогда не вызывался.

Ответ №2:

Мне показывались только цифры (индекс для каждого элемента раздела 0 (например, буква индекса), поэтому я обнаружил, что должен изменить это на:

         NSArray array;

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

            return array;
        }
  

Ответ №3:

Всем людям, которые не могут заставить обходной путь работать правильно:

Для меня это было потому, что я оставил там метод переопределения MonoTouch SectionIndexTitles — как только я его удалил (или в моем случае переименовал, чтобы его можно было вызвать из обходного пути), он сработал, как описано 🙂

Ответ №4:

Возникает та же проблема, но вышеупомянутое исправление не сработало, я уверен, что, вероятно, я делаю что-то простое неправильно. Приведенные ниже методы являются частью UITableViewSource. Все работает так, как это было до MT 4.0, однако текстовый индекс не отображается. Вывод отладки, приведенный ниже кода, показывает, что SectionTitles не вызывается. Есть мысли о том, чем это отличается от решения, приведенного выше, и как заставить его работать? Рад начать новую тему по этому вопросу, но подумал, что вместо этого было бы полезно получить больше информации по этому вопросу.

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

Вывод отладки:

SectionIndexTitles

A

B

C

D

E

F

G

H

J

K

L

M

N

O

P

R

S

T

W

applySectionIndexTitles = True

Комментарии:

1. Я только что дважды проверил свой код, и вы, похоже, делаете то же самое, что и я. Определены ли у вас также методы SectionFor() и TitleForHeader()? Если это все еще не работает, вы можете попробовать добавить примечание к ошибке, чтобы узнать, сможете ли вы получить дополнительные отзывы об обходном пути.

2. Оба SectionFor() и TitleForHeader() определены, но проблема по-прежнему сохраняется… попытаюсь привести простой пример и предоставить его ребятам из Mono. Просматривая обновления официальной ошибки, есть несколько других людей, у которых возникли проблемы с обходным путем. Однако спасибо за помощь!

Ответ №5:

Вау, ответы здесь крайне вводят в заблуждение. С чего мне начать?

Во-первых, почему в примерах используется резервный NSArray? Почему не строка [] для резервных данных? То, что метод возвращает NSArray, не означает, что вы должны поддерживать его с помощью NSArray. Ого. Зачем вам использовать NSArray, если в этом нет необходимости. Здесь это необязательно.

Во-вторых, реально, я всегда сохраняю заголовки своих индексов в резервной строке []. Я бы сказал, что это нормальное использование. Почему бы вам все равно этого не сделать? Из приведенных здесь ответов следует, что это особый случай или что-то в этом роде, где вы должны его сохранить. Насколько я знаю, вы всегда несете ответственность за это в любом случае. И еще один пример, основанный на ячейках для получения данных… С какой стати? Если вы не можете просто использовать массив, то получите подсказку, что ваш массив находится вне области видимости или что-то в этом роде.

Кроме того, некоторые люди упоминали, что не следует переопределять, как обычно. Ммм… Я не знаю об этом. Это полностью противоречит всему коду monotouch, который я видел. Я видел много примеров, в которых используются оба варианта, и это имеет смысл. Посмотрите на некоторые конструкторы шаблона UIViewController. Внутренним вызовам, которые явно ссылаются на селекторы, потребуется селектор. Обычно вам это не нужно, но в этом случае, по-видимому, что-то внутреннее сломано, ссылающееся на селектор. Это НЕ повод отказываться от переопределения, как вы обычно делаете. Вам все равно нужно переопределить его, если у вас есть какой-то внешний вызов, который пришел из вашего собственного управляемого кода. Вы все равно должны переопределить его. Если вы всегда явно не ссылаетесь на селекторы в своем коде … тогда оставьте его переопределенным.

В любом случае, многое из этого является моим общим пониманием monotouch, и я могу ошибаться. Я имею в виду, я не знаю… Я серьезно не пытаюсь критиковать. Мне просто пришлось прокомментировать, потому что мне кажется, что в этой теме МНОГО неверной информации, и я надеюсь, что этот пост поможет кому-то, кого, возможно, вводят в заблуждение.