• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

CoreData und NSTableView heightOfRow => Warnung

  • Ersteller Ersteller Deleted member 99757
  • Erstellt am Erstellt am

Deleted member 99757

Gast
Ich habe ein Problem mit NSTableView und heightOfRow. Beim ersten Mal wenn diese Methode aufgerufen wird bekomme ich immer die Meldung:

Warning: NSTableView/NSOutlineView variable row height code has detected re-entry. Avoiding a crash....

Code:
- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row
{
	[ [ [ self arrangedObjects ] objectAtIndex: row ] valueForKey: @"display" ];
	return 50;
}

Der code ansich macht so keinen Sinn, aber er soll nur zeigen was ich mache. Also sobald ich valueForKey (sonst nicht) aufrufe, kommt die Meldung. Sobald das App dann gestartet ist, bekomme ich dann keine Warnung mehr. Was bedeutet diese Warnung? Und was soll ich nun tun? Habe verschiede Beispiele im Netz gefunden die heightOfRow nutzen und dort ist es ähnlich in Verwendung.

Danke für Eure Hilfe :-)
 
Lässt sich so ins Blaue hinein zwar schwer sagen, aber vermutlich löst die display-Eigenschaft Deines Modells (?) ein redisplay Deines Tableviews aus (auch wenn Du nur lesend darauf zugreifst).
 
"display" ist ein property, dass direkt im "Interface Builder" mit der TableColumn verbunden ist. Gibt es vielleicht eine Möglichkeit zu erkennen, ob die Tabelle schon aufgebaut ist? Anscheinend tritt das nur beim ersten Aufbau auf und vermutlich wird heightOfRow als erstes ausgeführt?
 
display ist ein Transformable Attribute im DataModel und als

@property (nonatomic, retain) NSMutableAttributedString *display;

definiert. Mehr code gibt es nicht dazu.
 
Hast Du einen ArrayController abgeleitet?
Code:
...
[ self arrangedObjects ]
...
Ganz unabhängig von Deinem Problem solltest Du das nicht tun.
Vlt mal das Projekt posten?
 
Hast Du einen ArrayController abgeleitet?
Ja ich habe eine eigene Klasse als NSArrayController für die Tabelle.

Code:
...
[ self arrangedObjects ]
...
Ganz unabhängig von Deinem Problem solltest Du das nicht tun.
Nein? Ok, dass wußte ich nicht! Wie komme ich an den Inhalt?


Vlt mal das Projekt posten?
Das ganze Projekt? Ist mittlerweile schon etwas größer. Was genau brauchst du ... musst du wissen?

Code:
@interface tabController : NSArrayController <NSTableViewDelegate>
{
...
}
...

@end

@implementation tabController

...
- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row
{
	[ [ [ self arrangedObjects ] objectAtIndex: row ] valueForKey: @"display" ];
	return 50;
}
...

@end
 
Zuletzt bearbeitet von einem Moderator:
Hallo sumpfmonsterjunior,

hast du (oder jemand anderes) noch einen Tip für mich? Google gibt mir irgendwie auch keine vernünftige Hilfe :(
 
Wenn wir nicht wissen, wie dein Projekt aussieht, wie sollen wir denn bitte wissen, was wir brauchen, um dir zu helfen?

Gruss ppocket
 
Wie schon weiter oben geschrieben kann ich nur vage Vermutungen anstellen, aber womöglich löst Dein ArrayController ein redisplay aus (evtl. auto-rearranges content etc).
NSArrayController ist nicht zum Ableiten gedacht, packe die TableView-Delegate Methoden in einen eigenen Controller und gib diesem ein Outlet auf den ArrayController. Da vermischst Du zwei Sachen, die nicht zusammen gehören.

Gruß, SumpfMonsterJunior
 
@ppocket:
ok verstehe. Hilft es dir, wenn ich hier mehrere 1000 Zeilen Code poste? Wenn ich weiß, welche Teile hilfreich sind, dann poste ich die gerne!

@sumpfmonsterjunior:
"Auto Rearrange Content" war beim Array Controller gesetzt :-!

Herzlichen Dank ... das war es :-D
 
Zuletzt bearbeitet von einem Moderator:
Tu Dir den Gefallen und ändere Dein Design so, dass Du nicht von NSArrayController ableitest, sondern das Tableview in einen eigenen Controller packst (entweder von NSObject oder NSViewController erbend).

Dieser greift dann mittels eines Outlets auf den ArrayController zu.
 
ok verstehe, werde ich abändern. Danke für deinen Hinweis.