UITableView и CoreData - отображение данных в определенных строках и эффективность? - PullRequest
0 голосов
/ 20 ноября 2010

Итак, у меня есть объект данных Core, давайте назовем его сеансом (хорошо, именно так он и называется), и у него есть четыре атрибута (Имя, Драйвер, Трек и Автомобиль), которые я хотел бы показать в табличное представление. Раньше у меня это работало, но, увы, я пытаюсь сделать свои контроллеры представления немного более универсальными и многократно используемыми, поэтому я немного изменяю их. Вот как выглядит стол ... alt text

В контроллере представления передается Сессия, которая является подклассом NSManagedObject, который CoreData вызвала для меня. Driver, Car и Track - все объектные отношения, а name - просто строка. Driver, Car и Track имеют атрибут name, который я отображаю в этой таблице. Я хотел быстрый и грязный способ отображения этого текста в таблице. Итак, я делал что-то вроде ...

NSDictionary *parameterValues = [[NSDictionary alloc] initWithObjectsAndKeys: sessionName, [NSNumber numberWithInt: 0], sessionDriver, [NSNumber numberWithInt: 1], sessionCar, [NSNumber numberWithInt: 2], sessionTrack, [NSNumber numberWithInt: 3], nil];

NSString *parameterString;
if([indexPath row] > 0) {
    if([parameterValues objectForKey: [NSNumber numberWithInt: [indexPath row]]] == [NSNull null])  {
        parameterString = [[NSString alloc] initWithFormat: @"Select a %@", [parameterNames objectAtIndex: [indexPath row]]];
    } else{
        parameterString = [[parameterValues objectForKey: [NSNumber numberWithInt: [indexPath row]]] name];
    }
} else{
    parameterString = [parameterValues objectForKey: [NSNumber numberWithInt: 0]];
    if([parameterString isEqualToString: @""])  {
        parameterString = @"Enter A Name";
    }
}

Это работало до того, как я начал передавать сеанс в качестве переменной экземпляра, вместо того, чтобы отслеживать конкретные объекты строки, драйвера, автомобиля и трека. Так как [[self session] driver] вернет nil при передаче нового объекта сеанса, объект словаря не может быть использован. Вот как я это делаю сейчас ...

//these come in handy, they're the object names (We can use KVC), and we can use them in the table titles
NSArray *parameterNames = [[NSArray alloc] initWithObjects: @"Name", @"Driver", @"Car", @"Track", nil];

//get the object for this row... (Name, Driver, Car, Track), and create a string to hold it's value..
id object = [session valueForKey: [parameterNames objectAtIndex: [indexPath row]]];
NSString *parameterValue;

NSLog(@"%@", [session name]);

//if this isn't the name row...
if(object != nil)   {
    //if the indexPath is greater than 0, object is not name (NSString)
    if([indexPath row] > 0) {
        parameterValue = [object name];
    } else{
        parameterValue = object;
    }
} else{
    //object doesn't exist yet... placeholder!
    parameterValue = [@"Select a " stringByAppendingString: (NSString *)[parameterNames objectAtIndex: [indexPath row]]];
}

То, что я спрашиваю, это ... я делаю это правильно?

Спасибо, Мэтт - новичок в Core Data: /

1 Ответ

0 голосов
/ 22 ноября 2010

Ты слишком обдумал это. Если у вас есть сущность сеанса, подобная этой:

Session{
    name:string
    driver<-->Driver
    car<-->Car
    track<-->Track
}

и Driver, Car и Track имеют атрибут name, тогда все, что вам нужно сделать, чтобы заполнить фиксированную таблицу, это запросить значение атрибута, например:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell 
                                         forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell=//... get cell however you do it
    switch (indexPath.row) {
        case 0:
            cell.textLabel.text=self.currentSession.name
            break;
        case 1:
            cell.textLabel.text=self.currentSession.driver.name;
            break;
        //... and so on
        default:
            break;
    }
    //... return the cell. 
}

Аналогично, чтобы передать объект в подробный вид, вы просто используете тот же оператор switch, чтобы получить объект, связанный с выбранной строкой.

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