Почему мой метод newObject не вызывается? - PullRequest
2 голосов
/ 26 февраля 2012

Я следую упражнению из книги Какао Аарона Хиллегаса - глава о базовых данных. У меня есть основанное на документе приложение, которое сохраняет данные автомобиля (ов) в контроллер массива, затем оно использует привязки ... Проблема в том, что у меня есть средство выбора даты, и я хочу инициализировать его на сегодняшнюю дату, как только новая Добавлена ​​машина, поэтому мы создаем подкласс класса метод newObject NSArrayController. Но это всегда показывает 12.02.1982! NSLog внутри метода newObject не вызывается. Чего мне (или книге) не хватает?

CarArrayController.h

#import <Foundation/Foundation.h>

@interface CarArrayController : NSArrayController

@end

CarArrayController.m

#import "CarArrayController.h"

@implementation CarArrayController

- (id)init  //this is not called!
{
    self = [super init];
    if (self) {
        NSLog(@"in init");
    }
    return self;
}

-(id)newObject {   // not called either
    id newObj = [super newObject];
    NSDate *now = [NSDate date];
    [newObj setValue:now forKey:@"datePurchased"];
    NSLog(@"yep");
    return newObj;
}

@end

MyDocument.xib

Имеет экземпляр NSArrayController, его имя пользовательского класса установлено на CarArrayController.

PS: для моего контроллера массивов в MYDocument.xib отмечена кнопка «Подготовить содержимое», поэтому automaticallyPreparesContent следует установить на YES ...?

Ответы [ 3 ]

1 голос
/ 27 февраля 2012

Я думаю, что в Xcode 4.2 есть ошибка, на форуме bignerdranch есть ветка: http://forums.bignerdranch.com/viewtopic.php?f=183&t=3465

Каким-то образом XCode не осознает, что я изменил контроллер массива на свой собственный класс. Чтобы заставить его работать, я сначала добавил метод initWithcoder, затем заархивировал приложение, затем вернулся и удалил метод initWithCoder (возвращаясь к исходному коду), и теперь он работает! Люди в ветке выше предлагают другие решения, которые не имеют смысла ... Я предполагаю, что это ошибка ...

1 голос
/ 02 января 2017

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

Я думаю, что это ошибка.

Со своей стороны, у меня была такая же проблема. То, что я сделал, было:

1 - на вкладке «Выбор даты с помощью Stepper»> «Значение» я снял флажок «Привязать к автомобилям».
2 - CMD + Shift + K для очистки проекта
3 - CMD + Shift + B для построения проекта
4 - Запустите его и закройте
5 - Вернувшись на вкладку «Выбор даты с помощью Stepper»> «Значение», я установил флажок «Привязать к автомобилям».
6 - Повторили шаги 2-4, затем это сработало ...

Убедитесь, что класс вашего контроллера "Cars" установлен на CarArrayController

Я могу только предположить, что, поскольку мы создали привязку перед установкой нашего NSArrayController экземпляра для подкласса CarArrayController, эти изменения не распространяются на исходные привязки.

0 голосов
/ 26 февраля 2012

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

Что касается того, почему ваш переопределенный метод не вызывается, я могу только предположить, что вы создали подкласс NSArrayController, но почему-то его не используете? Как отображается контроллер, если вы регистрируете его?

...