2016-08-02 1 views
-1

Je veux développer une application de stockage en nuage et je veux atteindre cet utilisateur peut déplacer un fichier ou un dossier vers un autre dossier.comment faire la notification NSNotification par l'observateur spécifique?

-(void)setUpNote{ 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MoveCopypopViewClicked:) name:@"MoveCopypopViewClickedNotification" object:nil]; 
} 

Je fais une marque thisIsOnTop pour marquer le point de vue qui est sur le dessus.

-(void)viewWillAppear:(BOOL)animated{ 
self.thisIsOnTop = YES; 

[super viewWillAppear:YES]; 

self.myPopView = [[MoveCopyPopView alloc]initWithFrame:CGRectMake(0, screenH, screenW, bottomH)]; 

[HBKeyWindow addSubview:self.myPopView]; 

[UIView animateWithDuration:0.5 animations:^{ 
    self.myPopView.frame = CGRectMake(0, screenH - bottomH, screenW, bottomH); 
}]; 
[self setupRefresh]; 
} 

-(void)viewWillDisappear:(BOOL)animated{ 
self.thisIsOnTop = NO; 
if (self.tableViewStatus == 1) { 
    //[self.tableView setEditing:!self.tableView.editing animated:YES]; 
    self.tableViewStatus = 0; 
    [self disapperPopView]; 
} 
} 

-(void)MoveCopypopViewClicked:(NSNotification *)text{ 
NSDictionary * dict = text.userInfo; 
NSString * btnClicked = [dict objectForKey:@"btnClicked"]; 
self.mycurrentPOPBtnClicked = btnClicked; 

if ([self.myChooseType isEqualToString:@"file"]) { 
    if ([btnClicked isEqualToString:@"CreateFolderBtnClicked"]) { 

     [self showNewFolderView]; 

    }else if ([btnClicked isEqualToString:@"ConfirmBtnClicked"]){ 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"MoveCopypopViewClickedNotification" object:nil userInfo:self.prepareToPushFolderID]; 

     for (UIViewController *temp in self.navigationController.viewControllers) { 
      if ([temp isKindOfClass:[MyDesignTableViewController class]]) { 
       [self.navigationController popToViewController:temp animated:YES]; 
      } 
     } 

     [self disapperPopView]; 
     [self.tableView reloadData]; 
     [self.tableView.mj_header beginRefreshing]; 
    } 
}else if ([self.myChooseType isEqualToString:@"folder"]){ 
    if ([btnClicked isEqualToString:@"CreateFolderBtnClicked"]) { 
     [self showNewFolderView]; 

    }else if ([btnClicked isEqualToString:@"ConfirmBtnClicked"]){ 

     [self loadMoveFolderRequest]; 

     [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES]; 

     [self disapperPopView]; 
     [self.tableView reloadData]; 
     [self.tableView.mj_header beginRefreshing]; 
    } 
} 
} 

lorsque je me suis déplacé un fichier et choisir le dossier de destination et cliquez sur le bouton confirm-déplacer, le fichier n'a pas été déplacé dans le dossier que je choisis.

+0

Où avez-vous appelé 'postNotification'? – Thilo

+0

Pourquoi avez-vous 'YES' sur cette ligne:' [super viewWillAppear: YES]; '? – Avi

+0

Il n'y a rien dans le code posté sur le déplacement de fichiers, ni sur les notifications. – Avi

Répondre

2

Vous devez effectivement publier la notification pour que 'l'observateur' puisse s'activer.

EDIT:

Notez que si vous souhaitez recevoir la folderID dans la méthode loadMoveRequest, alors il devrait être le « sélecteur » dans addObserver comme ceci:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadMoveRequest:) name:@"MoveCopypopViewClickedNotification" object:nil]; 

Le vous poster la notification et laissez-passer le folderID:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MoveCopypopViewClickedNotification" object:nil userInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:folderID] forKey:@"folderID"]]; 

si vous avez besoin de transmettre des données spécifiques à la notification, vous pourriez le faire en définissant un NSDictionary-userInfo au lieu de passer nil.

mettre en œuvre Enfin, le loadMoveRequest: méthode comme ceci:

- (void)loadMoveRequest:(NSNotification *notification) { 

    NSInteger folderId = [[[notification userInfo] objectForKey:@"folderID"] integerValue]; 

} 
+0

Lorsque je clique sur le bouton de confirmation, je veux que l'ID de dossier de viewController actuel passe à' loadMoveRequest' – Matrix

+0

De quel type est la propriété folderID? Vous pouvez passer l'ID de dossier dans un dictionnaire et le définir comme userInfo.Si c'est un entier, vous pouvez le passer enveloppé dans un NSNumber comme ceci: [NSDictionary dictionaryWithObject: [NSNumber numberWithInteger: folderID] forKey: @ "ID de dossier"]; Définissez ceci comme 'userInfo' – akdsouza

+0

Notez que si vous voulez recevoir le folderID dans la méthode loadMoveRequest, alors ce devrait être le 'selector' dans addObserver comme ceci: – akdsouza

0

Vous devez gérer observateur comme suit dans la classe/viewcontroller dans lequel vous avez écrit la fonction pour déplacer des fichiers;

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MoveCopypopViewClicked:) name:@"MoveCopypopViewClickedNotification" object:nil]; 

Ensuite, vous devez écrire la fonction avec le nom MoveCopypopViewClicked qui aura le code pour déplacer les fichiers dans cette classe/viewcontroler.

Ensuite, vous devez déclencher la notification comme suit;

[[NSNotificationCenter defaultCenter] postNotificationName:@"MoveCopypopViewClickedNotification" object:nil userInfo:nil]; 

Et pour transmettre des valeurs à cette notification, vous pouvez passer NSDictionary à userInfo

+0

J'ai édité le 'MoveCopypopViewClicked', l'erreur de débogage montre que' Fin de l'application due à l'exception uncaught 'NSInvalidArgumentException', raison: '- [__ NSCFConstantString objectForKey:]: sélecteur non reconnu envoyé à l'instance 0x10b40c220'' – Matrix

+0

Vous avez pas passé NSDictionary approprié dans Notification. Il indique que la valeur que vous avez transmise est de type ** NSCFConstantString ** – Rohan