0

CoreDataを使用して保存されているタグを一覧表示する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を使用してみましたが、これも期待どおりに動作しませんでしたが、これは別の問題です!)

4

1 に答える 1

0

私自身の質問に答えます。ドー!

ユーザーがボタンをクリックして新しいタグを追加したときに、ユーザーを編集モードにするために使用したメソッドがすでにあります。

- (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];

問題が解決しました。私はこれを解決しようとして多くの時間を無駄にしました-コードにあまりにも関与し、私がやろうとしていることを見ないという典型的な例です。この投稿を最初に見た場所を忘れてしまいました。誰でも、ありがとうございます。

于 2011-06-08T08:24:47.667 に答える