Comment appliquer un ValueTransformer a un PopupButton?

Lio70

Membre expert
Club iGen
16 Janvier 2004
2 396
1 282
Bonjour,

Situation :
Un Popup qui liste une serie de valeurs numeriques representant des pourcentages.
Dans la base de donnes, ce sont des valeurs telles que 0.25 mais je voudrais que le Popup affiche 25% et non 0.25
On ne peut pas appliquer directement un NSNumberFormatter au Popup par Interface Builder puisque les elements d'un Popup sont des String.
D'ou l'obligation de creer un ValueTransformer qui capte la String, converti en type numerique, applique un NumberFormatter avec PercentStyle puis retourne une nouvelle String.

Creer le ValueTransformer n'est pas un probleme, mais comment l'appliquer a un Popup? Je bloque. Aucun effet sur content objects ni content values...
 
http://www.macresearch.org/tutorial_cocoa_bindings_and_value_transformers

c'est un peu vieux mais le principe est le meme
tu appliques ton value transformer par "nom de class", tu peux aussi faire ca en code, je te conseille de suivre le tuto avec une petit app test et non pas dans ton projet (tu vas foutre le merdier :D), quand tu as bien saisi ou se trouve les elements tu peux reproduire ca dans ton projet final.

ces objets sont assez abstraits

mais ici des ports assez simple car single threaded mais toute la logique y est

https://github.com/cucurbita/inutero/blob/master/foundation-kit-100/FKValueTransformer.php

lisant ce code, je suis un grand malade :D et oui j'ai fait ca pour m'amuser avec pheup, j'avais meme commencé a implementer ca directement dans zend en c++, car c'est un peu limite question perfs (mais acceptable j'ai ete pas mal surpris, ca reste 500% plus rapide que symphony et toutes ces horreurs) pour les observers (reflection swizzle et variables membres observées et le manque de static initializer sur un contenaire class), mais peut etre que je reprendrais ca un jour pour ajouter un obj-c/foundation like runtime a zend

Bloc de code:
<?php

//
//  UnitTests
//  FoundationKit
//
//  Copyright Cucurbita. All rights reserved.
//

require_once "../FoundationKit.php";

$tree = FKArray::init();
for ($i = 0; $i < 10; $i++ ) {
	$child = FKDictionary::withObject(
		FKNumber::withInt($i), "someKey"
	);
	$parent = FKDictionary::withObject(
		$child, "storage"
	);
	$tree->addObject($parent);
}

//print_r($tree);

$values = $tree->valueForKeyPath("storage.someKey");

echo "\n(\n";

foreach($values as $number) {
	echo " ".$number->intValue()."\n";
}

echo ")\n\n";

?>
:o :D ptain ca marche
Bloc de code:
<?php

//
//  UnitTests
//  FoundationKit
//
//  Copyright Cucurbita. All rights reserved.
//

require_once "../FoundationKit.php";

define('AObjectClass', 'AObject');
define('BObjectClass', 'BObject');

define('kNoteName1', 'note1');
define('kNoteName2', 'note2');
define('kNoteName3', 'note3');
define('kNoteName4', 'note4');

class AObject extends FKObject 
{
	public $toto;
	const isa = AObjectClass;

	static function init() {
		$self = parent::init(AObjectClass);
		$self->toto = true;
		return $self;
	}

	function toto() {
		return FKNumber::withBool($this->toto);
	}

	function setToto(FKNumber $num) {
		$this->toto = $num->boolValue();
	}

	function notify($note = null) {
		echo self::isa."::";
		print_r($note);
	}
}

class BObject extends FKObject 
{
	const isa = BObjectClass;

	static function init() {
		$self = parent::init(BObjectClass);
		return $self;
	}

	function notify($note = null) {
		echo self::isa."::";
		print_r($note);
		if (null != $note) {
			if ($note->name()->isEqualToString(kNoteName3)) {
				$center = FKNotificationCenter::defaultCenter();
				$center->postNotificationName(kNoteName2, null);
			}
		}
	}
}

$a = AObject::init();
$b = BObject::init();

$center = FKNotificationCenter::defaultCenter();

print_r($a->valueForKey(FKSTR("toto")));

$a->setValueForKey(FKNumber::withInt(0), FKSTR("toto"));

print_r($a->valueForKey(FKSTR("toto")));

//exit();

$center->addObserver($b, "notify", kNoteName1, $b);
$center->addObserver($a, "notify", kNoteName2, null);
$center->addObserver($b, "notify", kNoteName3, null);
$center->addObserver($b, "notify", kNoteName4, $a);

$center->postNotificationName(kNoteName1, $b);
$center->postNotificationName(kNoteName2, null);
$center->postNotificationName(kNoteName3, null);
$center->postNotificationName(kNoteName4, $a);

$center->removeObserver($b);
$center->removeAllObservers();

print_r($center);

?>

the last one I promess :love:

Bloc de code:
<?php

//
//  UnitTests
//  FoundationKit
//
//  Copyright Cucurbita. All rights reserved.
//

define('FKDefaultLocaleIdentifier', 'de_DE');

require_once "../FoundationKit.php";


$charset = FKCharacterSet::alphanumericCharacterSet();

print_r($charset);

print_r($charset->characterIsMember("\t"));

//exit(0);

$now = FKDate::init();
$ten = FKNumber::withInt(10);
$two = FKNumber::withInt(2);
$threePointFour = FKNumber::withDouble(3.4);
$onePointFour = FKNumber::withDouble(1.7);


$now->performSelector("toto");

//print_r($now->isaInstanceGetMethods(FKStringClass));

//exit(0);

$array = FKArray::withObjects(
	FKSTR("Banana"),
	FKSTR("Apple"),
	FKSTR("étourdie"),
	FKSTR("éa"),
	FKSTR("Cherry"),
	FKSTR("å"),
	FKSTR("Pear"),
	FKSTR("epic")
);

echo "\n\n";

$arrayOfDates = FKArray::withObjects(
	$now->dateByAddingTimeInterval(180),
	$now->dateByAddingTimeInterval(60),
	$now,
	$now->dateByAddingTimeInterval(120)
);


$dict = FKDictionary::withObjectsAndKeys(
	FKSTR("Array1"), $array, 
	FKSTR("Array2"),$array,
	FKSTR("Array3"),$arrayOfDates
);

//exit(0);

$arrayOfDates->sortUsingSelector("compare");

echo "\n\n -- arrayOfDates::sortUsingSelector:compare \n";

foreach($arrayOfDates as $obj) {
	echo $obj->characterStringDescription()."\n";
}

function orderByASC($obj1, $obj2) {
	return $obj1->timeIntervalSinceReferenceDate() > $obj2->timeIntervalSinceReferenceDate();
}

$arrayOfDates->sortUsingFunction('orderByASC', null);

echo "\n\n -- arrayOfDates::sortUsingFunction:orderByASC \n";

foreach($arrayOfDates as $obj) {
	echo $obj->characterStringDescription()."\n";
}

function printMessage($message, $context) {
	$context = is_object($context) ? get_class($context) : $context;
	echo "\n".$context."::printMessage: '".$message."'\n";
}

FKArray::resolveInstanceMethod("printMessage");

echo FKArray::instancesRespondToSelector("printMessage");

FKArray::resolveClassMethod("printMessage");
FKArray::printMessage("hello");

$arrayOfDates->printMessage("hello");

//exit(0);

echo "\n\n -- arrayOfDates::sortUsingComparator:'^(\$obj1, \$obj2) {
	return \$obj1->timeIntervalSinceReferenceDate() < \$obj2->timeIntervalSinceReferenceDate();
}'\n";

/*$arrayOfDates->sortUsingComparator('^($obj1, $obj2) {
	return $obj1->timeIntervalSinceReferenceDate() < $obj2->timeIntervalSinceReferenceDate();
}');*/

$arrayOfDates->sortUsingComparator(function ($obj1, $obj2) {
     return $obj1->timeIntervalSinceReferenceDate() < $obj2->timeIntervalSinceReferenceDate();
});

foreach($arrayOfDates as $obj) {
	echo $obj->characterStringDescription()."\n";
}

$arrayOfDates->enumerateObjectsUsingBlock(function ($object, $idx, &$stop) {
	if ($idx > 1) {
		$stop = true;
	}
	echo $idx." -- ".$object->hash()." -- ".$object->characterStringDescription()."\n";
});

echo "\n\n -- arrayOfDates::enumerateObjectsUsingBlock:'^(\$object, \$idx, &\$stop) {
	if (\$idx > 0) {
		\$stop = true;
	}
	echo \$idx.\" -- \".\$object->characterStringDescription().\"\\n\";
}'\n";

$arrayOfDates->enumerateObjectsUsingBlock('^($object, $idx, &$stop) {
	if ($idx > 0) {
		$stop = true;
	}
	echo $idx." -- ".$object->characterStringDescription()."\n";
}');

$context = FKObject::init();
$arrayOfDates->enumerateObjectsUsingBlock('^($object, $idx, &$stop, $context) {
	if ($idx > 0) {
		$stop = true;
	}
	echo $idx." -- ".$context->characterStringDescription()." -- ".$object->characterStringDescription()."\n";
}', $context); // to forward this


$arrayOfDates->enumerateObjectsUsingBlock('^($object, $idx, &$stop) {
	global $context;
	if ($idx > 1) {
		$stop = true;
	}
	echo $idx." -- ".$context->characterStringDescription()." -- ".$object->characterStringDescription()."\n";
}');

//exit();

$arrayOfNumbers = FKArray::withObjects(
	$ten,
	$onePointFour,
	$two,
	$threePointFour
);

echo "\n\n -- arrayOfNumbers::sortUsingSelector:compare \n";

$arrayOfNumbers->sortUsingSelector("compare");

foreach($arrayOfNumbers as $obj) {
	echo $obj->characterStringDescription()."\n";
}

echo "\n\n -- newarray::sortedArrayUsingSelector:caseInsensitiveCompare \n";

$a = $array->sortedArrayUsingSelector("caseInsensitiveCompare");

foreach ($a as $obj) {
	echo $obj->characterStringDescription()."\n";
}

// Enumeration
$enumerator = $array->objectEnumerator();
$object = null;
$i = -1;
while($object = $enumerator->nextObject()) {
	//echo $object->characterStringDescription()."\n\n";
	$i++;
	if ($i > 1) { break; }
}

echo "\n\n -- array::enumerator::allObjects: \n";

foreach ($enumerator->allObjects() as $obj) {
	echo $obj->characterStringDescription()."\n";
}

$enumerator = $array->reverseObjectEnumerator();
$object = null;
$i = $array->count() - 1;
while($object = $enumerator->nextObject()) {
	//echo $object->characterStringDescription()."\n\n";
	$i--;
	if ($i < 1) { break; }
}

echo "\n\n -- array::reversed_enumerator::allObjects: \n";

foreach ($enumerator->allObjects() as $obj) {
	echo $obj->characterStringDescription()."\n";
}

echo "\n\n";

?>
 
Dernière édition:
Grand merci pour ton input.

Je testerai demain car maintenant c'est l'heure des aiguillettes de boeuf aux poires/ail/thym deglacees au vin rouge. Evidemment que c'est moi qui cuisine; Madame attend. :D
 
Dernière édition:
Yo,

Pas vraiment eu le temps aujourd'hui. Mais j'ai lu tes exemples. En fait je sais comment appliquer un ValueTransformer dans l'absolu (deja fait auparavant avec des textfield et label) mais ici le probleme c'etait sur un groupe d'elements (popup). Lors de mes recherches, j'avais d'ailleurs deja vu l'exemple que tu as mis en lien.

Quand je l'applique sur SelectedObject, c'est uniquement l'element actif du popup qui est transforme correctement. Des que je clique sur le bouton, les autres elements de la liste ne sont pas transformes. Alors j'essaye sur ContentValues ou contentObjects mais la, rien n'est transforme. Et je n'ai aucun message d'erreur ni warning avec mon code.

Tes exemples en PHP sont interessants, je vais un peu creuser cela. C'est peut-etre le code de mon Transformer qui ne couvre pas toute la situation correctement (le fait qu'un popup soit une collection d'objets et non un element unique).

Il est 23h. L'esclave sexuel retourne au travail :D:p:love: