2010-11-12 4 views
1

J'essaie de créer un volet de préférence qui se trouve dans les préférences du système. Toutes les liaisons sont effectuées comme d'habitude (pour une application fenêtrée normale), mais lorsque le setter de la propriété de liaison est appelé (les données sont mises à jour), les données de la table ne sont pas réinitialisées. Les panneaux de préférences sont-ils capables de mettre à jour les données de table via des liaisons? J'ai également essayé d'utiliser une source de données de table sans succès.Volet de préférences et liaisons NSTableView

Pour clarifier, j'ai une propriété NSMutableArray dans la classe principale de mon prefPane, un objet représentant la classe principale de prefPane, et un arrayController dans IB qui est lié à la colonne de la table. Dans la méthode init de la classe principale de prefPane, je définis la valeur de NSMutableArray, qui est correctement reflétée dans le panneau pref (juste pour tester si les bindings fonctionnent), j'ai un NSTimer qui réinitialise la valeur de mon tableau NSMutable quand ça finit. Un message de console me dit que la valeur est correctement réinitialisée, cependant, les changements ne sont pas reflétés dans le panneau pref. Donc, dans ma version actuelle, j'utilise le code suivant pour définir les propriétés à des valeurs arbitraires (simplifié pour essayer d'obtenir des liaisons pour fonctionner). La valeur de la propriété est ensuite réinitialisée par un temporisateur 10 secondes plus tard. Bien que la propriété soit correctement mise à jour (vérifiée par le journal de la console), le volet pref ne reflète pas les modifications dans la tableview. Malheureusement, je ne peux pas poster des captures d'écran des liaisons. J'ai un objet dans IB pour la classe syncFrontEndPref. J'ai alors un arraycontroller lié à cet objet avec un chemin clé de modèle de listArray. Ensuite, ma colonne de table est liée aux objets arrangés arraycontroller. Cela se charge correctement avec "test", "test1", "test2" dans le volet pref (tel que rempli à partir de la méthode init). Toutefois, lorsque repeuplée de la minuterie, les modifications ne sont pas reflétées dans le volet pref (bien que journal de la console confirme ListArray a en effet changé

Voici le code:.

@interface syncFrontEndPref : NSPreferencePane 
{ 

    NSMutableArray *listArray; 
    NSNumber *syncInt; 
    AuthenticateUser *newUser; 
    NSMutableArray *syncIntervalList; 
    IBOutlet NSTableView *theTableView; 

} 

@property (retain) NSMutableArray *listArray; 
@property (retain) NSMutableArray *syncIntervalList; 

- (void) mainViewDidLoad; 
-(IBAction)syncIntervalValueChanged:(id)sender; 
-(IBAction)tableViewSelected:(id)sender; 



@implementation syncFrontEndPref 

@synthesize listArray, syncIntervalList; 

-(id) init{ 

    //populate nsarray w/ list data to display 
    //[self setListArray: [NSMutableArray arrayWithArray:[[[NSDictionary dictionaryWithContentsOfFile:[GetFilePath pathForFile]] objectForKey:@"lists"] allObjects]]]; 
    [self setListArray: [NSMutableArray arrayWithObjects: @"test", @"test1", @"test2", nil]]; 

    //define values for drop-down sync interval selector 
    [self setSyncIntervalList:[NSMutableArray arrayWithObjects: @"1 minute", @"5 minutes", @"10 minutes", @"30 minutes", @"24 hours", nil]]; 

    return self; 

} 

//code for the timer and selector method 
- (void) mainViewDidLoad{ 
NSTimer *timer = [[NSTimer new] autorelease]; 
    int syncTime = 10; 
    timer = [NSTimer scheduledTimerWithTimeInterval: syncTime target:self selector:@selector(targetMethod:) userInfo:nil repeats: YES]; 
} 

-(void)targetMethod:(id)sender{ 

NSLog(@"running timer..."); 

[self setListArray: [NSMutableArray arrayWithObjects: @"0", @"1", @"2", nil]]; 
NSLog(@"%@", listArray); 
} 
+1

Que diriez-vous du code? – Eimantas

+0

Plus précisément, comment sont définis les accesseurs de votre matrice mutable? –

Répondre

0

Je pense que vous avez deux instances de Si vous créez un projet de panneau de préférences à partir du modèle, le propriétaire du fichier sera le panneau NSPreferencePane Si vous avez ajouté une autre entrée pour l'objet syncFrontEndPref, vous allez créer une deuxième copie de l'objet, et mainViewDidLoad ne sera pas appelé dans le second. ggered pour cette copie de l'objet et le listArray ne sera pas mis à jour. Essayez d'ajouter une instruction de journal à la méthode init. Si vous voyez cette instruction de journal s'exécuter deux fois, vous avez deux copies de l'objet.

Si vous avez deux copies de l'objet, je suggère de supprimer la copie que vous avez ajoutée au xib dans IB. Modifiez la classe du propriétaire du fichier dans votre classe syncFrontEndPref et connectez vos liaisons à cet objet.


Est-ce que cela ressemble à votre fichier xib actuel dans IB?

alt text

+0

Vous aviez parfaitement raison. Deux des mêmes objets étaient dans mon xib. Les liaisons fonctionnent parfaitement maintenant. Merci beaucoup. – ambientdiscourse

Questions connexes