2011-01-26 4 views
2

Я клянусь, что я искал всю базу данных Google для возможного решения, но я до сих пор застрял в этом вопросе :)Получить значения из UITextFields внутри пользовательских UITableViewCell

В принципе, у меня есть 12 строк в таблице базы данных для который я создаю пользовательский UITableViewCell с 4 UITextFields внутри. Столбцы таблицы выглядеть следующим образом (SQLite)

EntryFieldID NUMBER 
Description TEXT 
FieldType TEXT 

Теперь я хочу, чтобы каждый UITableViewCell Тэг быть EntryFieldID выше, так что я могу легко обратиться к нему позже для хранения в другой таблице. Эта таблица выглядит так.

OrderID  NUMBER 
EntryFieldID NUMBER 
Value1  TEXT 
Value2  TEXT 
Value3  TEXT 
Value4  TEXT 

В 4 * Значение поля являются 4 UITextFields, которые находятся внутри каждого в UIViewCell.

Надеюсь, что это имеет смысл до сих пор :)

Теперь в моем TableViewSource У меня есть этот код:

protected List<InfoCaptureTableViewGroup> _tableItems; 
protected string _customCellIdentifier = "InfoCaptureField"; 
protected Dictionary<int, InfoCaptureTableViewCell> _cellControllers = new Dictionary<int, InfoCaptureTableViewCell>(); 

public InfoCaptureTableSource (List<InfoCaptureTableViewGroup> items) 
{ 
    this._tableItems = items; 
} 

/// <summary> 
/// Called by the TableView to determine how many sections(groups) there are. 
/// </summary> 
public override int NumberOfSections (UITableView tableView) 
{ 
    return this._tableItems.Count; 
} 

/// <summary> 
/// Called by the TableView to determine how many cells to create for that particular section. 
/// </summary> 
public override int RowsInSection (UITableView tableview, int section) 
{ 
    return this._tableItems[section].Items.Count; 
} 

/// <summary> 
/// Called by the TableView to retrieve the header text for the particular section(group) 
/// </summary> 
public override string TitleForHeader (UITableView tableView, int section) 
{ 
    return this._tableItems[section].Name; 
} 

/// <summary> 
/// Called by the TableView to retrieve the footer text for the particular section(group) 
/// </summary> 
public override string TitleForFooter (UITableView tableView, int section) 
{ 
    return this._tableItems[section].Footer; 
} 

/// <summary> 
/// Called by the TableView to retreive the height of the row for the particular section and row 
/// </summary> 
public override float GetHeightForRow (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath) 
{ 
    return 44f; 
} 

public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath) 
{ 
    // is there a way to NOT reuse cells? There's only ever going to be 12 of them 
    UITableViewCell cell = tableView.DequeueReusableCell (this._customCellIdentifier); 
    InfoCaptureTableViewCell customCellController = null; 
    InfoCaptureField item = this._tableItems[indexPath.Section].Items[indexPath.Row]; 

    //---- if there are no cells to reuse, create a new one 
    if (cell == null) 
    { 
     customCellController = new InfoCaptureTableViewCell(); 

     // retrieve the cell from our custom cell controller 
     cell = customCellController.Cell; 

     // disable selection 
     cell.SelectionStyle = UITableViewCellSelectionStyle.None; 

     // This is where I'd like to use the EntryFieldID 
     cell.Tag = Environment.TickCount; 

     // store our controller with the unique ID we gave our cell 
     this._cellControllers.Add (cell.Tag, customCellController); 
    } 
    else 
    { 
     // retrieve our controller via it's unique ID 
     customCellController = this._cellControllers[cell.Tag]; 
    } 

    //---- return the custom cell 
    return cell; 
} 

Код выше на самом деле не делать слишком много смысла для меня, он был скопирован с примера MonoTouch. Я понимаю, что ячейки повторно используются, но мне бы хотелось избежать этого, поэтому я могу использовать EntryFieldID для свойства Tag для пользовательской ячейки, а также для того, чтобы я мог перемещаться по всем строкам UITableView (который, как я понимаю, может быть невозможен) ,

Итак, если кто-то может пролить свет на мой нынешний подход, независимо от того, осуществимо это или нет, или я должен смотреть на повторное выполнение всего этого все вместе.

+0

У вас есть доступ к базе данных Google? Я завидую вам;) –

+0

Мы все делаем Mr @Kettler :) – Marko

ответ

7

Вы бы сделать себе большую пользу, если вы не считаете UITableViewCells в качестве строительных блоков для вашего приложения, но для чего они: временные объекты, которые создаются и уничтожаются по требованию для предоставления информации.

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

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

У вас есть несколько вариантов:

(а) Использование UITableViewCells так, как они должны быть использованы. Это может раздражать, но есть инструменты, которые делают это намного проще, например MonoTouch.Диалог или вы можете проверить свою запись в блоге о шаблонах проектирования для UITableViewCells:

http://tirania.org/monomac/archive/2011/Jan-18.html

(б) Вы могли бы вместо того, чтобы повторно использовать один и тот же идентификатор соты в коде, используйте идентификатор один сотовый для каждой строки. Это заставит UITableView создавать новые ячейки, по одному на каждую строку, которую вы хотите посмотреть позже. Если у вас всего 12 строк, это не должно быть проблемой.

+0

Благодарим вас за отличную информацию о UITableView ... Я только что прочитал ваш пост в блоге, и теперь я понимаю, что я применил совершенно неправильный подход к моей проблеме. Я не совсем понимаю, это ваш второй вариант вашего ответа об использовании идентификатора ячейки для каждой строки. Вы говорите, что UITableView создаст новые ячейки, означает ли это, что информация, введенная в текстовые поля, будет потеряна при прокрутке для просмотра других ячеек? В качестве альтернативы вместо пользовательского UITableViewCell я мог бы создать собственное представление и использовать ScrollView для их отображения. – Marko

+0

Если у вас есть один идентификатор на ячейку, когда вы «деактивируете», вы всегда будете снимать одну и ту же ячейку, поэтому сохраненные вами значения будут по-прежнему присутствовать. –

+0

Спасибо @miguel - любая идея, как будет выглядеть этот код? Я попытался добавить 'InfoCaptureFieldID' как' TAG' ячейки, но я получаю «Элемент с тем же ключом, который уже существует в словаре». – Marko

1

Лучший способ не будет реализовывать ваш собственный вид ячеек, а просто реализовать пользовательский вид и добавить его в contentView ячейки как подвью.

поэтому каждый доступ к GetCell вам нужно заменить подклассы contentView на ваш собственный.

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

+0

Я не совсем понимаю @Max - Можете ли вы разработать свой первый абзац? Что касается проблем с выбором, то аксессуаров - эта таблица тоже не нужна. – Marko

+0

хорошо, это не лучшая идея создать контроллер ячейки для каждой ячейки. вам просто нужен просмотр и просмотр контроллера, особенно если вам не требуется взаимодействие с пользователем здесь. – Max

+0

Я только что использовал пример с этого сайта (http://simon.nureality.ca/?p=91), и все работает отлично. Мне нужен контроллер ячейки, потому что некоторые вычисления происходят после того, как вы начинаете добавлять значения в текстовые поля ... Тем не менее - как бы вы отступили от этих значений? – Marko

Смежные вопросы