Вставить новый UITableViewCell в Master из Detail

У меня есть простое приложение master-detail, и я использую подробное представление для настройки данных для вставки в основной список.

У меня есть собственный класс под названием «Расчет», который представляет собой объект, который мне нужно вставить в каждую строку.

Я могу передать объект из подробного представления в главное представление, просто он не будет вставлять новую строку.

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

- (IBAction)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
    [f setNumberStyle:NSNumberFormatterDecimalStyle];
    NSString *s = @"1";
    NSNumber *n = [f numberFromString:s];

    Calculation *calc = [[Calculation alloc] initWithValue:@"$1661.70" descr:@"1 Ounce 24k Gold" textInput:@"1" percentDisplay:@"0%" purityIndex:n metalIndex:n weightUnitIndex:n sliderValue:n];

    [segue.destinationViewController insertNewObject:calc];
}

И в MasterViewController вот мой код вставки:

    -(void)insertNewObject:(NSObject *)newCalculation {

        if (!_objects) {
            _objects = [[NSMutableArray alloc] init];
        }
        [_objects insertObject:newCalculation atIndex:0];
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];

        [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

    }

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

    NSObject *object = [_objects objectAtIndex:indexPath.row];
    cell.textLabel.text = [object valueForKey:@"value"];
    cell.detailTextLabel.text = [object valueForKey:@"descr"];
    cell.textLabel.shadowColor = [UIColor blackColor];
    cell.textLabel.shadowOffset = CGSizeMake(0, -1);
    return cell;
}

Я могу печатать объект весь день с помощью NSLog в MVC, но независимо от того, сколько раз я добавляю объект из контроллера подробного представления, счетчик массива всегда равен 1, и ни одна ячейка никогда не добавляется в табличное представление.

Тот же точный код отлично работает, если я создаю экземпляр объекта в MVC и вставляю его.


person jhilgert00    schedule 13.04.2012    source источник


Ответы (1)


Переход - это действительно неправильный механизм для отправки данных от детали к мастеру. (Он отлично работает в другом направлении!) Вам лучше определить протокол делегата, который имеет -(void)insertNewObject:(NSObject *)newCalculation; в качестве обязательного метода, заставить вашего мастера реализовать этот протокол и передать его в качестве делегата вашей детали. контроллер.

Затем детальный контроллер просто вызывает [delegate insertNewObject:calc];.

person Phillip Mills    schedule 13.04.2012
comment
Спасибо, Филипп, не могли бы вы дать мне немного больше рекомендаций о том, как именно реализовать делегат/протокол? - person jhilgert00; 13.04.2012
comment
Если вы не знакомы с протоколами, более простой способ (хотя и не такой «элегантный») — поместить свойство, называемое делегатом, в ваш детальный контроллер, который содержит ссылку на ваш главный контроллер. В вашем первоначальном переходе к деталям попросите мастера сделать что-то вроде detail.delegate = self;. Импортируйте основной файл .h в детальный файл .m, а затем вызовите метод, как указано выше. - person Phillip Mills; 13.04.2012
comment
Еще раз спасибо Филипп. Я читаю о делегатах и ​​отмечу ваш ответ, когда он заработает. Проблемы в данный момент. - person jhilgert00; 13.04.2012