【问题标题】:UITableview not updating values after adding observer?添加观察者后,UITableview 不更新值?
【发布时间】:2015-12-10 12:55:20
【问题描述】:

我有两个 UIViewController

UIViewController-1UIViewController-2

UIViewController-1 将具有 UIButton 名称作为过滤器

当我点击过滤按钮时,它会将UIViewController-2 UIView添加到UIViewController-1

通过此代码

- (IBAction)filterAction:(id)sender {
    if (isDown==NO) {
        isDown=YES;
        UIViewController* rvc=[self.storyboard instantiateViewControllerWithIdentifier:@"SearchCriteriaViewController"];
        self.overlayView=rvc.view;
        CGRect rect=self.overlayView.frame;
        rect.origin.y=self.overlayView.frame.origin.y+110;
        rect.size.height=self.overlayView.frame.size.height-160;
        self.overlayView.frame=rect;
        [self addChildViewController:rvc];
        [self.view addSubview:self.overlayView];
        [rvc didMoveToParentViewController:self];
    } else {
        isDown=NO;
        [self.overlayView removeFromSuperview];
    }
}

效果很好。

UIViewController-2 有一些以 UIButton 名称作为过滤器的进程。

当我点击过滤按钮时,它会从服务器获取一些值并将其存储到NSDictonary中。

我想将值传递给 UIViewController-1

所以我正在使用 NSNotificationCenter

首先删除 UIViewController-2 然后我发布了通知。

[self willMoveToParentViewController:nil];
[self.view removeFromSuperview];
[self removeFromParentViewController];
[[NSNotificationCenter defaultCenter] postNotificationName:@"postArrayObject" object:response];

UIViewController-1 我得到了观察者。

-(void)viewWillAppear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(objFirstViewController:) name:nil object:nil];
}

-(void)objFirstViewController:(NSNotification *)notification {
    if ([[notification name]isEqualToString:@"postArrayObject"]) {
        self.arrayFromSearch=[NSMutableArray arrayWithArray:(NSMutableArray *)[notification object]];
        NSLog(@"%@",self.arrayFromSearch);
        [eventList removeAllObjects];
        NSMutableDictionary *dictionary;
        for (NSDictionary *dic in self.arrayFromSearch) {
            dictionary=[NSMutableDictionary dictionary];
            [dictionary setObject:[dic valueForKey:@"eventDate"] forKey:@"EVENTDATE"];
            [dictionary setObject:[dic valueForKey:@"eventId"] forKey:@"EVENTID"];
            if ([[dic valueForKey:@"country"] isKindOfClass:[NSNull class]]) {
                [dictionary setObject:@"" forKey:@"COUNTRY"];
            }else{
                [dictionary setObject:[dic valueForKey:@"country"] forKey:@"COUNTRY"];
            }if ([[dic valueForKey:@"eventImage"] isKindOfClass:[NSNull class]]){
                [dictionary setObject:@"" forKey:@"EVENTIMAGE"];
            }else{
                [dictionary setObject:[dic valueForKey:@"eventImage"] forKey:@"EVENTIMAGE"];
            }if([[dic valueForKey:@"state"] isKindOfClass:[NSNull class]]){
                [dictionary setObject:@"" forKey:@"STATE"];
            }else{
                [dictionary setObject:[dic valueForKey:@"state"] forKey:@"STATE"];
            }
            [dictionary setObject:[dic valueForKey:@"eventName"] forKey:@"EVENTNAME"];
            [dictionary setObject:[dic valueForKey:@"eventTime"] forKey:@"EVENTTIME"];
            [dictionary setObject:[dic valueForKey:@"isFeature"] forKey:@"FEATURE"];
            [dictionary setObject:[NSString stringWithFormat:@"%@",[dic valueForKey:@"latitue"]] forKey:@"LAT"];
            [dictionary setObject:[NSString stringWithFormat:@"%@",[dic valueForKey:@"langitude"]] forKey:@"LANG"];
            [eventList addObject:dictionary];
        }

        // [self.listTableView reloadData];
        // [self.listTableView performSelectorOnMainThread:@selector(reloadTable) withObject:nil waitUntilDone:YES];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.listTableView reloadData];
        });

        previousSeletedIndex=[[NSUserDefaults standardUserDefaults]integerForKey:@"last"];
        if (previousSeletedIndex>5) {
            [[NSUserDefaults standardUserDefaults]removeObjectForKey:@"last"];
            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:previousSeletedIndex inSection:0];

            [self.listTableView scrollToRowAtIndexPath:indexPath
                                      atScrollPosition:UITableViewScrollPositionBottom
                                              animated:YES];
        }else{
        }
    }
    else{            
    }
}

调用所有内容,我从 Notificaton Object 获取值并将其存储到本地 NSMutableArray

当我重新加载 UITableView 时不更新值

但是调用了数据源和委托。

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    终于找到了解决方案。 我不知道确切的原因,但我的理解 它阻塞了主线程

    dispatch_async(dispatch_get_main_queue(), ^{
                [self.listTableView reloadData];
            });
            [self.listTableView setNeedsLayout];
    

    通过添加此代码,它可以工作

    【讨论】:

      【解决方案2】:

      当你像这样添加观察者时,你需要传递name

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

      【讨论】:

      • 每当您添加观察者时,您都添加名称。
      • 我想,这就是我所做的,问题是没有更新数据
      • @vaibby karthik 能够通过他的观察者名称调用他的观察者并成功地使用新的数组列表加载数据源,但是在重新加载表视图以更新表视图时他无法更新表视图新东西。如果我的理解有误,karthik 纠正我。
      猜你喜欢
      • 2011-12-10
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      相关资源
      最近更新 更多