Получить скрытое значение из ячейки в TableView - PullRequest
1 голос
/ 28 сентября 2010

Я хочу заполнить TableView данными из базы данных и, когда коснитесь ячейки, в didSelectRowAtIndexPath, отправив выбранный идентификатор в новое представление.

Я хотел бы просмотреть в тексте ячейки описание записи и поместить идентификатор в скрытое поле / свойство ячейки, но я не смог найти способ сделать это. Я знаю, что могу получить идентификатор из источника данных (что-то вроде [my_data_source objectAtIndex: indexPath.row];), но мне не очень нравится этот способ, я бы предпочел, чтобы идентификатор был назначен одной ячейке.

Есть ли способ сделать это?

Заранее спасибо и приветствую с.

Ответы [ 2 ]

2 голосов
/ 28 сентября 2010

Полагаю, вы пришли из веб-разработки?Мне также было трудно сделать это таким образом, но это лучший способ.Это, вероятно, возможно, но лучше, если вы привыкнете делать это так, это действительно так.

По сути, определяют NSArray в файле .h (так что весь сценарий может его использовать).

затем в функции init:

// set the array
myArray = [NSArray arrayWithObjects:@"One",@"Two",@"Threee",nil];
[myArray retain];

затем методы делегирования табличного представления:

// set numebr of rows
- (CGFloat)tableView:(UITableView *)tableView numberOfRowsForSection:(NSUInteger)section {
  return [myArray count];
}

// set the cell titleLabel value
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  // set the cell - I can't remember the exact code then do:
  cell.textLabel.text = [myArray objectAtIndex:[indexPath row]];
}

// similarly
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  NSLog(@"%@",[myArray objectAtIndex:[indexPath row]];
}

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

Когда вы начнете использовать это, вы увидите, что это намного лучшечем «скрыть» идентификатор где-то в таблице.Чтобы получить что-то из базы данных, я бы предложил добавить все это в словарь, массив или тому подобное и делать это так, когда вы инициализируете класс, но если вы действительно хотите сделать это динамически, тогда притворитесь, что ваши «скрытые» идентификаторы простоИндексы массива.Таким образом, идентификатор # 1 находится в индексе 1 в вашем массиве.:)

1 голос
/ 28 сентября 2010

Хорошо, это быстрый взлом другого подхода. Мне всегда нравится иметь дело с объектами, которые являются самодостаточными. Упакуйте все данные, которые вы хотите, в пользовательский класс (здесь он называется MyData) для табличного представления, которое вы инициализируете с минимальным количеством, которое вам нужно. идентификатор и текст, который вы извлекли из базы данных. Вы также реализуете функцию, которая может загружать оставшиеся данные из БД.

Когда элемент выбран, вы передаете экземпляр вашего объекта контроллеру подпредставления и заполняете его данные из базы данных. Вы можете запустить заполнение в основном viewcontroller или subviewcontroller, это не имеет значения.

Суть в том, чтобы упаковать все данные, которые собираются вместе, в один объект (по сути, это «модель», у которой уже есть представление и контроллер), а затем заполнить представления путем доступа к этому объекту. Это сохраняет ваш интерфейс одинаковым во всех ваших приложениях. И делает изменения проще. Например, если вы обнаружите, что лучше заполнить все данные из БД в начале вашей программы, вы можете сделать это сейчас, не изменяя другие представления.

@interface MyObject : NSObject
{


}

// Create a stump object that contains only the necessary info
+ (id) withName:(NSString)name id:(int)id;

// loads the rest of your data from the DB
- (void) fillFromDb;

@property (readwrite, retain) NSString name;
@property (readwrite, assign) int id;
// The data fields that you need 

@end

// in tableview controller

@interface MyTableViewController ...
{
    NSMutableArray _dbData;

}


@end

@implementation MyTableViewController

- (void) viewDidLoad {
    // Load your data from DB
    for (int i =0; i < dbCount; ++i)
    {
        MyObject* data = [MyObject withName:dbName[i] id:dbId[i];
        [_dbData addObject:data];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  cell.textLabel.text = [_dbData objectAtIndex:[indexPath row]];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //Create Subviewcontroller

            // Optional call fillFromDb here and not in subviewcontroller
    subviewcontroller.dbData = [_dbData objectAtIndex:[indexPath row]];

    //activate subview
}


@interface SubViewController {
    MyObject* _dbData;
}

@end

@implementation SubViewController

- (void) viewDidLoad {
  [_dbData fillFromDb];
  // Do View Initialisations with the newly fetched Data
}

Код здесь только для демонстрации архитектуры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...