что не так с этим кодом UITableView, где я использую передачу по ссылке для обновления записи конфигурации основных данных? - PullRequest
0 голосов
/ 06 октября 2011

У меня есть конфигурация основных данных в моем приложении для iPhone, и то, как я в настоящее время передаю конфигурацию в представление, которое позволяет пользователю РЕДАКТИРОВАТЬ данные, заключается в передаче базового объекта данных по ссылке. Фактически я выделил атрибут класса базовых данных (NSString) для «UITextField.text» в представлении редактирования, так что, если он обновляется, он эффективно обновляет объект основных данных. Вопрос:

  1. кажется, что работает нормально, когда я создаю / обновляю эту строку в режиме редактирования
  2. когда я обновляю отдельное поле (не рассматриваемое), тогда значение кажется равным нулю

Вопрос - Есть ли что-то принципиально неправильное в этом подходе передачи по ссылке с использованием атрибута управляемого объекта базовых данных?

Фрагменты кода:

а) В контроллере редактирования - в cellForRowAtIndexPath

if (indexPath.row == 0) {
        // Setup
    UITextField *titleTextField = nil;
    // Get Cell
    self.nonWorkTermCell = [tableView dequeueReusableCellWithIdentifier:@"nonWorkTermCell"];
    if (self.nonWorkTermCell == nil) {
        self.nonWorkTermCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"nonWorkTermCell"] autorelease];
            self.nonWorkTermCell.textLabel.text = @"Non Work Term:";

            titleTextField = [[self newTextFieldForCell:self.nonWorkTermCell] autorelease];
            titleTextField.keyboardType = UIKeyboardTypeURL;
            titleTextField.returnKeyType = UIReturnKeyDone; 
        titleTextField.delegate = self;  // TODO: Is this needed at all?
        titleTextField.tag = 1;
            [self.nonWorkTermCell addSubview:titleTextField];
    }
    // Set Value
    titleTextField.text = self.weConfig.nonWorkTerm;   // ** ASSIGNS THE CORE DATA MANAGED OBJECT CONFIG ITEM DIRECTLY TO THE TEXT FIELD

        // Return 
    return self.nonWorkTermCell;

b) и вспомогательный метод, который он использует:

- (UITextField *)newTextFieldForCell:(UITableViewCell *)cell {
    UITextField *addTextField = [[UITextField alloc] initWithFrame:frame];  //cut the code for the frame to save space
    addTextField.autocorrectionType = UITextAutocorrectionTypeNo;
    addTextField.autocapitalizationType = UITextAutocapitalizationTypeNone;
    addTextField.delegate = self;
    addTextField.clearButtonMode = UITextFieldViewModeNever;
    addTextField.enabled = YES;
    addTextField.returnKeyType = UIReturnKeyDone;
    addTextField.clearButtonMode = UITextFieldViewModeWhileEditing;  
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    return addTextField;
}

в) затем вернемся к делегату

- (void)applicationWillResignActive:(UIApplication *)application {
    [self saveContext];
}

- (void)applicationWillTerminate:(UIApplication *)application {
    [self saveContext];
} 

Ответы [ 3 ]

1 голос
/ 07 октября 2011

Назначение свойства NSString управляемого объекта для textField и редактирование содержимого текстового поля не распространят эти изменения обратно на управляемый объект по ряду причин:

  • NSString является неизменным, поэтому по определению вы не будете вносить изменения в один и тот же объект
  • Объект, возвращаемый средством доступа к управляемому объекту, вполне может быть автоматически выпущенной копией базового значения
  • текстовое поле также, вероятно, принимает копию любого значения, присвоенного его текстовому свойству
  • Изменения не вернутся к модели, если они не прошли через средства доступа к управляемым объектам, которые включают уведомления KVO
  • Вся идея безумна.Что если я захочу взять строку, полученную из управляемого объекта, и выполнить с ней какую-то другую операцию для представления или анализа?
0 голосов
/ 06 октября 2011

Грег,

Обсуждаемая строка:

titleTextField.text = self.weConfig.nonWorkTerm;

и weConfig является вашим управляемым объектом?и nonWorkTerm является NSString?

Если ответом на все вышеизложенное является «да», то это поддерживаемое задание.(Я не уверен, почему вы думаете, что это передача по ссылке. Похоже, значение присваивается мне напрямую. [На самом деле, titleTextField, скорее всего, скопирует строку.])

Чтоэто проблема?

Андрей

0 голосов
/ 06 октября 2011

Кажется, что передача управляемого свойства динамических данных ядра по ссылке может не работать ....?

Таким образом, этот ответ (для голосования / подтверждения) заключается в том, что передача управляемого свойства данных динамического ядра по ссылке нене работает.

[Я перешел на ручную настройку модели с помощью «textFieldDidEndEditing», который, кажется, что-то исправляет]

...