Dit is een topic in Community » Forum » Pro » Software-ontwikkeling

Enable/disable verschillende NSSwitchButtons in NSTableColumn

dj bazzie wazzie

dj bazzie wazzie op 07 oktober 2010 #

Ik vond dit op de developers site en in de laatste zin van de 4e paragraaf staat dat in een table column telkens dezelfde NSCell wordt gebruikt.

Wat ik namelijk wil is dat ik een checkbox (NSSwitchButton) gebruik in mijn table column en die op sommige rijen enabled heb staan en andere weer disabled. Wanneer ik nu setEnabled: gebruik wordt mijn gehele column veranderd. Nu is dit duidelijk terug te vinden waarom dit gebeurt in de documentatie maar mijn vraag is hoe ik dit het beste kan doen.

Ik zat namelijk te denken om drie images te laden namelijk: unchecked-disbaled, unchecked-enabled en checked-enabled. Wanneer iemand op de NSCell klikt verander ik gewoon de image en wanneer er een disabled image staat doe ik niets. Maar eigenlijk vind ik dit persoonlijk niet de mooiste oplossing. Stel in OS X 10.7 worden de checkboxen iets anders getekend, dan heeft mijn programma een oude checkbox-look. Wanneer ik dit update klopt het op oudere systemen niet meer. Dit is eigenlijk het enige dat ik tegen deze methode heb.

Daarom is mijn vraag hier: Heeft er iemand een beter of ander idee?

Bij voorbaat dank.

lord anubis op 07 oktober 2010 #

Heb je misschien al gekeken naar alle table delegates?

- (void)tableView:willDisplayCell:forTableColumn:row:
{
if (tableColumn == column) {
if (tableRow == row) {
[cell setState:NO];
...

Het komt er eigenlijk mop neer dat je de cellen die zichtbaar zijn per row/column aanpas.
Heb je een tabel met 100 kolommen en 20001 regels, maar met 5 kolommen en 20 regels zichtbaar dan worden er max 100 cellen even snel aangepast. Kost niets aan mem en tijd ten op zichtte van een aanpassing per cel en deze opslaan 'ergens'.

Of bedoelde je dit niet?

lord anubis op 07 oktober 2010 #

In geval van dat je je column een naam ( identifier ) hebt mee gegeven kan je ook nog dit er tussen plaatsten

NSString *identifier = [tableColumn identifier];
if ( [identifier isEqualToString: @"jou_Kolom_ident"]) {

Willemien op 08 oktober 2010 #

NSTableColumn heeft een binding voor enabled maar daar heb je alleen iets aan als je met bindings werkt en iets hebt om het aan vast te binden, eventueel met een value transformer (die je ook zelf kan maken). zonder binding zou ik zoiets doen als lord anubis zegt. het kan ook in
-tableView: dataCellForTableColumn:row: van de delegate. ik zou alleen setEnabled: doen i.p.v. setState:

lord anubis op 08 oktober 2010 #

dj bazzie wazzie - op 07 oktober 2010
Ik zat namelijk te denken om drie images te laden namelijk: unchecked-disbaled, unchecked-enabled en checked-enabled. Wanneer iemand op de NSCell klikt verander ik gewoon de image en wanneer er een disabled image staat doe ik niets. Maar eigenlijk vind ik dit persoonlijk niet de mooiste oplossing. Stel in OS X 10.7 worden de checkboxen iets anders getekend, dan heeft mijn programma een oude checkbox-look. Wanneer ik dit update klopt het op oudere systemen niet meer. Dit is eigenlijk het enige dat ik tegen deze methode heb.
Daarom is mijn vraag hier: Heeft er iemand een beter of ander idee?
Bij voorbaat dank.

Ter aanvulling,

In geval van dat je een eigen 'graphic' voor een check/status cel wilt creeeren, dan is ook dan het beste om een NSCell te gebruiken met op het moment dat je een status wilt laat zien deze via de cel tekent i.p.v afbeeld ( valt onder zelfde actie als eerder beschreven eigenlijk ). Toekomst stabiel voor jouw en voor de gebruiker als deze b.v het beeld scherm met 125% vergroot, kolommen aanpast, etc. Hoe ziet dan je image eruit!
Ik denk, veel te veel werk om al deze zaken onder controle te houden met alleen drie afbeeldingen. En ze worden, dacht ik ergens gelezen te hebben, wel intern gekopieerd per cel.

Ik denk dat Willemien gelijk heeft m.b.t setEnabled, alles was n.l. even uit het hoofdje.

HTH

dj bazzie wazzie

dj bazzie wazzie op 08 oktober 2010 #

Hartelijk dank voor jullie info.

Dit had ik ook al ontdenkt. Wat er miste aan mijn vraag was namelijk dat ik het moet doen met de data die in de tabel staat. Het is namelijk een bestaand project gemaakt in Applescript-Studio van iemand anders. Nu dacht ik snel even een functie te programmeren in Objective-C, toevoegen aan mijn project en aanroepen met call method. Maar helaas lijkt dit niet zo eenvoudig.

Ik heb het maar even in Applescript opgelost (om kosten te besparen). Er hangt nu een click handler achter de table view en de volgende functie wordt aangeroepen
on clickedInTable(theObject)
if clicked row of theObject < 1 then
return
end if
if name of clicked data column of theObject is equal to "ACTION" then
set theRow to clicked data row of theObject
if contents of data cell "ACTION" of theRow is equal to uncheckedImage then
set contents of data cell "ACTION" of theRow to checkedImage
else if contents of data cell "ACTION" of theRow is equal to checkedImage then
set contents of data cell "ACTION" of theRow to uncheckedImage
end if
end if
end clickedInTable

De variabelen uncheckedImage en checkedImage zijn allebei een NSImage die ik aan het begin van het programma al in laad. Dan bij het aanmaken van een data row moet je er wel op letten dat je even update views van de data source uitzet totdat je de image in de data cell hebt geplaatst omdat het systeem anders foutmeldingen geeft of je programma is onverwacht gestopt.

dj bazzie wazzie

dj bazzie wazzie op 08 oktober 2010 #

@lord anibus: de hoogte van de rijen kunnen niet worden aangepast dus hiermee heb ik niet kampen. Wanneer ik het helemaal opnieuw mocht doen koos ik voor de bovengenoemde delegates zoals ik dat normaal ook doe. Maar helaas heb je het niet allemaal voor het kiezen.

Moet zeggen nu ik het al een los onderdeel heb draaien (soort threading) werkt Applescript boven mijn verwachting. Elke record doet een check door een xmlrpc call naar een server te doen en doet nog steeds 4 tot 5 records per seconde inclusief deze check. Dit duurde velen malen langer wanneer ik het in het programma zelf zou draaien. Deze thread was ik nodig omdat ik in een progress panel een annuleer button wilde hebben zodat het process per direct gestopt kan worden.

Je kunt alleen reageren met een gratis OMT account.
Log in of registreer.

Inloggen

Over dit topic

Gestart op 07 oktober 2010 door dj bazzie wazzie

Laatste reactie door dj bazzie wazzie

Reageer op dit topic