Ios 如何让特定观察员听到通知?

Ios 如何让特定观察员听到通知?,ios,objective-c,Ios,Objective C,我想开发一个云存储应用程序,我想实现用户可以将文件或文件夹移动到另一个文件夹 -(void)setUpNote{ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MoveCopypopViewClicked:) name:@"MoveCopypopViewClickedNotification" object:nil]; } 我设置了一个标记thisIsOnTop来标记顶部的视图 -(void

我想开发一个云存储应用程序,我想实现用户可以将文件或文件夹移动到另一个文件夹

-(void)setUpNote{

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MoveCopypopViewClicked:) name:@"MoveCopypopViewClickedNotification" object:nil];
}
我设置了一个标记thisIsOnTop来标记顶部的视图

-(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];
    }
}
}

当我移动文件并选择目标文件夹并单击“确认移动”按钮时,文件未移动到我选择的文件夹。

您需要实际发布通知,以便激活“观察者”

编辑:


请注意,如果希望在loadMoveRequest方法中接收folderID,则它应该是addObserver中的“选择器”,如下所示:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadMoveRequest:) name:@"MoveCopypopViewClickedNotification" object:nil];
您发布通知并传递folderID时所需的时间:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MoveCopypopViewClickedNotification" object:nil userInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:folderID] forKey:@"folderID"]];
如果需要传递特定于通知的某些数据,可以通过将NSDictionary设置为userInfo而不是传递nil来实现

最后实现loadMoveRequest:方法,如下所示:

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

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

}

您需要在类/viewcontroller中处理observer,您在其中编写了移动文件的函数

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MoveCopypopViewClicked:) name:@"MoveCopypopViewClickedNotification" object:nil];
然后,您必须编写名为MoveCopypopViewClicked的函数,该函数将有代码来移动该类/ViewController中的文件

然后您需要触发通知,如下所示

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

要通过此通知传递值,您可以将NSDictionary传递给userInfo

您在哪里调用了postNotification?为什么在这一行有YES:[超级视图将显示:YES];?发布的代码中没有关于移动文件或通知的内容。这是一个公司应用程序,我在其他应用程序的基础上编辑代码。setupNote在ViewDidLoad中被调用。当我单击“确认”按钮时,我希望当前viewController的folderID传递给LoadMoveRequest folderID属性是什么类型?您可以在字典中传递folderID并将其设置为userInfo。如果它是一个整数,则可以将其封装在NSNumber中传递,如下所示:[NSDictionary Dictionary WithObject:[NSNumber numberWithInteger:folderID]forKey:@folderID];将其设置为“userInfo”注意,如果您想在loadMoveRequest方法中接收folderID,那么它应该是addObserver中的“选择器”,如下所示:loadMoveRequest是一种连接后端api的方法,它接收文件将移动到的目标文件夹的folderID,并且还接收文件ID。确定,因此,在收到文件ID后,您可以发布通知。只需确保要使用“fileID”执行某些操作的方法是addObserver方法中通知的选择器。然后,该方法可以像上面代码中显示的那样访问fileID。我编辑了MoveCopypopViewClicked,调试错误显示由于未捕获异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\u NSCFConstantString objectForKey:]:无法识别的选择器发送到实例0x10b40c220'您未在通知中传递正确的NSDictionary。它表示您传递的值是NSCFConstantString类型