NSTable теряет фокус после настоящего: ошибка - PullRequest
0 голосов
/ 07 июня 2011

У меня есть NSTableView, в котором перечислены теги, которые хранятся с использованием основных данных. Значением по умолчанию для тега является «без названия», и мне нужно, чтобы каждый тег был уникальным, поэтому у меня есть подпрограмма проверки, которая перехватывает пустые и неуникальные значения и работает нормально. Я не хочу, чтобы пользователь мог сохранять значение «без названия» для тега, поэтому я наблюдаю NSControlTextDidEndEditingNotification, который вызывает следующий код:

- (void)textEndedEditing:(NSNotification *)note {
  NSString *enteredName = [[[note userInfo] valueForKey:@"NSFieldEditor"] string];
  if ([enteredName isEqualToString:defaultTagName]) {
    NSString *dString = [NSString stringWithFormat:@"Rejected - Name cannot be default value of '%@'", defaultTagName];
    NSString *errDescription = NSLocalizedStringFromTable( dString, @"Tag", @"validation: default name error");
    NSString *errRecoverySuggestion = NSLocalizedStringFromTable(@"Make sure you enter a unique value for the new tag.", @"Tag", @"validation: default name error suggestion");
    int errCode = TAG_NAME_DEFAULT_VALUE_ERROR_CODE;

    NSArray *objArray = [NSArray arrayWithObjects:errDescription, errRecoverySuggestion, nil];
    NSArray *keyArray = [NSArray arrayWithObjects:NSLocalizedDescriptionKey, NSLocalizedRecoverySuggestionErrorKey, nil];
    NSDictionary *eDict = [NSDictionary dictionaryWithObjects:objArray forKeys:keyArray];
    NSError *error = [[NSError alloc] initWithDomain:TAG_ERROR_DOMAIN code:errCode userInfo:eDict];

    NSBeep();
    [preferencesWindowsController presentError:error];

    unsigned long index = [self rowWithDefaultTag];
    [self selectRowIndexes:[NSIndexSet indexSetWithIndex:index] byExtendingSelection:NO];
    // [self editColumn:0 row:index withEvent:nil select:YES];
  }
}

- (unsigned long)rowWithDefaultTag {
  __block unsigned long returnInt;
  [managedTags enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([[obj valueForKey:@"name"] isEqualToString:defaultTagName]) {
    returnInt = idx;
    *stop = YES;
    }
  }];
  return returnInt;
}

С закомментированной строкой 'editColumn' код работает, поэтому, если пользователь принимает имя тега по умолчанию, не редактируя его, ошибка создается, отображается и процесс завершается, оставляя соответствующую строку в таблице выделенной.

Однако я хотел бы сделать еще один шаг и перевести пользователя в режим редактирования. Когда я раскомментирую строку 'editColumn', поведение совсем не то, что я ожидал - tableView теряет свое синее поле фокуса, и строка, которая представляет новый тег, пуста. Если я нажимаю на tableView, строка становится видимой. Я потратил много времени на это и нигде не нашел, поэтому некоторая помощь с этим была бы очень признательна.

(Примечание: я попытался использовать textDidEndEditing, который также не вел себя так, как я ожидал, но это отдельная проблема!)

1 Ответ

0 голосов
/ 08 июня 2011

Отвечая на мой собственный вопрос.Doh!

У меня уже был метод, который я использовал для перевода пользователя в режим редактирования, когда он нажимал кнопку, чтобы добавить новый тег:

- (void)objectAdded:(NSNotification *)note {
  if ([[note object] isEqual:self]) {    
    [self editColumn:0 row:[self rowWithDefaultTag] withEvent:nil select:YES];
  }
}

Создание уведомления для вызова этого решенияпроблема и переводит пользователя в режим редактирования правильно.Важно не пытаться сделать это на существующем цикле выполнения;поэтому отправка уведомления следующим образом откладывает доставку до следующего цикла выполнения:

// OBJECTADDED is a previously defined constant.
NSNotification * note = [NSNotification notificationWithName:OBJECTADDED  object:self];
[[NSNotificationQueue defaultQueue] enqueueNotification: note postingStyle: NSPostWhenIdle];

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

...