tableView-strul i Cocoa!

Tråden skapades och har fått 11 svar. Det senaste inlägget skrevs .
1

Nu är jag igång igen angående Cocoa. Jag har problem med en tableView som inte vill visa mina object riktigt rätt. För er som läst Aaron Hillegass bok "Cocoa Programming for Mac OS X" känns kanske RaiseMan-projektet igen. Jag har dock ändrat lite smått på det!

Min tableView ska visa upp en array som lagrar object av typen Person. Varje "Person" har följande instansvariabler:

NSString *personName;
int personAge;
Book *personBook;

Varje bok har i sin tur två instansvaribler:

NSString *bookTitle;
int pageCount;

Dessa skall alltså presenteras i en tabell. Se bild:

Bild

Hela mitt program funkar klanderfritt, men som ni ser är bakgrunden till de kollumner som presenterar böckerna vita stället för den tilltänkta bakgrundsfärgen.

Är det någon som har något tips om vad som kan vara fel? Vilken information behöver ni för att hjälpa mig osv?

Tidigare länk till samma project:

kent kanske kan hjälpa till nu igen?

Tack på förhand!

/JO

Snälla, länka till bilderna... /glemme

[ 21 Maj 2002, 17:12: Meddelandet ändrat av: Jont Olof ]

  • Medlem
  • International user
  • 2002-05-21 09:45

Jag har inte läst boken, hur ser koden för det man ändrar färgen i preferences ut?

Jag har en klass PreferenceController som sköter controllpanelen. Såhär ser PreferenceController.h ut:

#import <AppKit/AppKit.h>
extern NSString *BNRTableBgColorKey;
extern NSString *BNREmptyDocKey;

@interface PreferenceController : NSWindowController
{
IBOutlet NSColorWell *colorWell;
IBOutlet NSButton *checkbox;
}
- (IBAction)changeColor:(id)sender;
- (IBAction)changeNewEmptyDoc:(id)sender;
@end

... och i PreferenceController.m är de första raderna, innan implementationen, som följer:

#import "PreferenceController.h"

NSString *BNRTableBgColorKey = @Table Background Color;
NSString *BNREmptyDocKey = @Empty Document Flag;

@implementation PreferenceController

Implementationen av själva changeColor metoden ser ut på följande sätt:

- (IBAction)changeColor:(id)sender
{
NSNotificationCenter *nc;
NSColor *color = [sender color];
NSData *colorAsData = [NSArchiver archivedDataWithRootObject:color];
[[NSUserDefaults standardUserDefaults] setObject:colorAsData
forKey: BNRTableBgColorKey];
nc = [NSNotificationCenter defaultCenter];
[nc postNotificationName:@BNRColorChanged object:color];
NSLog(@Sent notification BNRColorChanged);
}

Räcker detta eller har jag glömt att redovisa något viktigt?

/JO

  • Oregistrerad
  • 2002-05-21 15:42

Får man fråga vad det är för roligt program som använder amigans bouncingball på din screenshot?

  • Medlem
  • International user
  • 2002-05-21 16:10
Citat:

quote:Skapades ursprungligen av: Jont Olof:
nc = [NSNotificationCenter defaultCenter];
[nc postNotificationName:@BNRColorChanged object:color];
NSLog(@Sent notification BNRColorChanged);

Räcker detta eller har jag glömt att redovisa något viktigt?

/JO

Finns det någon klass som lyssnar efter en @BNRColorChanged notification?

Det här är init-funktionen för min "MyDocument"-klass. Om jag förstått notifications rätt så har jag här gjort MyDocument till lyssnare av mina notifications från PreferenceControllern. Eller är jag helt ute och cyklar?

#import "MyDocument.h"
#import "Person.h"
#import "PreferenceController.h"

@implementation MyDocument
- (id)init
{
NSNotificationCenter *nc;
if(self=[super init])
{
students = [[NSMutableArray alloc]init];
[self createNewStudent];
nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(handleColorChange:)
name:@BNRColorChanged
object:nil];
NSLog(@Registered with notification center);
}
return self;
}

/JO

Citat:

quote:Skapades ursprungligen av: Ekelund:
Får man fråga vad det är för roligt program som använder amigans bouncingball på din screenshot?

Ett fantastiskt program från Aaron Hillegass "Cocoa Programming for Mac OS X". En höjdarbok tycker jag, men jag har testat litegrann vid sidan av och kört fast lite på ett sidospår som han inte tar upp... Sånt händer!

/JO

Här kommer handleColorChange-metoden:

- (void)handleColorChange:(NSNotification *)note
{
NSColor *color = [note object];
NSLog(@"Got notification: %@", note);
[tableView setBackgroundColor:color];
[self updateUI];
}

  • Medlem
  • International user
  • 2002-05-21 18:10

Jag har svarat på icq, så frågan är inte ignorerad om det är någon annan som är intresserad av svaret..

Vi kom inte på någon briljant metod, så kom gärna med förslag..

Ingen briljant metod kanske, men vi kom fram till följande...

I tableViewn´s DataSource-metod för updatering av informationen tryckte vi in en if-sats för att kontrollera om NSCellen var genomskinlig m.h.a. metoden isOpaque. Se nedan:

- (void)tableView:(NSTableView *)aTableView
setObjectValue:(id)anObject
forTableColumn:(NSTableColumn *)aTableColumn
row:(int)rowIndex
{
NSString *identifier = [aTableColumn identifier];
Person *person = [students objectAtIndex:rowIndex];
[person takeValue:anObject forKey:identifier];
[self updateChangeCount:NSChangeDone];

if([[aTableColumn dataCellForRow:rowIndex] isOpaque])
{
[[aTableColumn dataCellForRow:rowIndex] setDrawsBackground:NO];
}
else
{
NSLog(@"Cellen i raden %d och kolumnen %@ aer genomskinliga", rowIndex, aTableColumn);
}

}

Genom att använda funktionen setDrawsBackground: till NO så stängs bakgrundsfärgen av. Tada! Det är fixat!!
Problemet som kvarstår är att få min tableView att automatiskt stänga av denna bakgrund redan från början. Hur detta skall gå till vet jag inte, men förhoppningsvis kommer jag (eller någon, kanske kent) på något!

Förslag är fortfarande välkommna...

/JO

[ 22 Maj 2002, 01:08: Meddelandet ändrat av: Jont Olof ]

Nu har jag äntligen löst problemet, med en inte helt oansenlig del hjälp från kent! Tack så mycket!!! Dock visade det sig att problemet var enklare att lösa än jag från början tänkt mig. Ibland är det värt att gå tillbaka till lite basics!!

Jag pillrade in följande forsatser i awakeFromNib i min "MyDocument"-class.

- (void)awakeFromNib
{
int i, k = 0;
NSArray *columnArray = [tableView tableColumns];
NSTableColumn *tableColumn;

for-sats mellan i=0 och i < antalet columner
{
tableColumn = [columnArray objectAtIndex: i];

for-sats mellan k = 0 och k < students count
{
[[tableColumn dataCellForRow: k] setDrawsBackground:NO];
}
}

[deleteButton setEnabled:NO];

}

... och det gjorde biffen. P.g.a. HTML-förbud kunde jag inte skriva ut for-satserna med korrekt syntax, men ni förstår säkert vad jag menar.

/JO

Efter lite diskussioner med kent kom vi fram till följande. NSCell (eller dataCell) fungerar som en mall för hela columnen. Pss. kunde jag rationalisera bort den andra forloopen och loopen blev att se ut såhär istället (jmfr med ovanstående):

for(i = 0 ; i < [columnArray count]; i++ )
{
tableColumn = [columnArray objectAtIndex: i];

[[tableColumn dataCell] setDrawsBackground:NO];

}

1
Bevaka tråden