Frage

Ich habe eine NSTableView mit einer einzigen Spalte.In dieser Spalte ist im Interface Builder "Bearbeitbar" aktiviert, aber ein Doppelklick auf eine Zelle in der Tabellenansicht führt zu nichts.Ich habe bestätigt (in -tableView:viewForTableColumn:row: durch Überprüfen [tableColumn isEditable]), dass für die Tabellenspalte das editierbare Flag gesetzt ist.Was würde verhindern, dass die Spalte bearbeitet wird, wenn isEditable == YES?

Es wurde vorgeschlagen, dass ich meine Datenquelle und meinen Delegiertencode einschließe.Der dataArray ist eine Eigenschaft, die speichert NSManagedObject Unterklassenobjekte. listPopupButton wählt aus, welche Entität in einem angezeigt werden soll NSTableView das kann verschiedene Entitäten anzeigen, die alle nur ein Namensattribut haben (wie durch die nameOnlyItems methode, die ein Array von diesen zurückgibt).

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
  return [[self dataArray] count];
}

- (NSView *)tableView:(NSTableView *)tableView
   viewForTableColumn:(NSTableColumn *)tableColumn
                  row:(NSInteger)row {
  NSTableCellView *cellView;
  NSNumber *index = [NSNumber numberWithInteger:[[self listPopupButton] indexOfSelectedItem]];

  if ([[self nameOnlyItems] containsObject:index]) {
    CVCAbstractEntity *entity = [[self dataArray] objectAtIndex:row];
    NSString *name = [entity name];
    cellView = [tableView makeViewWithIdentifier:@"nameOnly" owner:self];
    [[cellView textField] setStringValue:name];

  } else if ([index integerValue] == CVCListPopUpIndexPublishers) {
    CVCPublisher *publisher = [[self dataArray] objectAtIndex:row];
    NSString *identifier = [tableColumn identifier];
    NSString *content;

    content = [[publisher valueForKeyPath:identifier] description];
    if ([identifier containsString:@"year"] && [content isEqualToString:@"0"]) {
      content = @"";
    }

    cellView = [tableView makeViewWithIdentifier:identifier owner:self];
    [[cellView textField] setStringValue:content ? content : @""];

  } else if ([index integerValue] == CVCListPopUpIndexSeries) {
    CVCSeries *series = [[self dataArray] objectAtIndex:row];
    NSString *identifier = [tableColumn identifier];
    NSString *content;

    content = [[series valueForKeyPath:identifier] description];
    if ([identifier containsString:@"year"] && [content isEqualToString:@"0"]) {
      content = @"";
    }

    cellView = [tableView makeViewWithIdentifier:identifier owner:self];
    [[cellView textField] setStringValue:content ? content : @""];
  }

  return cellView;
}

- (void)tableView:(NSTableView *)tableView sortDescriptorsDidChange:(NSArray *)oldDescriptors {
  NSMutableArray *mutableDataArray = [[self dataArray] mutableCopy];
  [mutableDataArray sortUsingDescriptors:[tableView sortDescriptors]];

  [self setDataArray:mutableDataArray];
  [[self nameOnlyTableView] reloadData];
}
War es hilfreich?

Lösung

Es stellt sich heraus, dass nicht nur die Tabellenspalte bearbeitet werden muss, sondern auch das Textfeld in der Zellenansicht.Durch Auswahl dieses Textfelds und Auswahl von Bearbeitbar aus dem Menü Verhalten wurde das Problem behoben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top