在ios中的选项卡式应用程序中刷新UIview

在ios中的选项卡式应用程序中刷新UIview,ios,objective-c,uiview,refresh,Ios,Objective C,Uiview,Refresh,我有一个带有两个选项卡的选项卡式应用程序 在第二个选项卡上,我绘制了一个图表 但每次我按下此选项卡时,UIview都不会刷新 我试过了 [self.view setNeedsDisplay] inside - (void)viewDidLoad 但仍然没有刷新 我尝试将代码从-(void)viewDidLoad粘贴到-(void)viewDidAppear 但什么也没发生 等待答复 编辑:整个源代码 - (void)viewDidLoad { //[self.view setNe

我有一个带有两个选项卡的选项卡式应用程序

在第二个选项卡上,我绘制了一个图表

但每次我按下此选项卡时,UIview都不会刷新

我试过了

[self.view setNeedsDisplay]

inside

- (void)viewDidLoad
但仍然没有刷新

我尝试将代码从
-(void)viewDidLoad
粘贴到
-(void)viewDidAppear

但什么也没发生

等待答复

编辑:整个源代码

- (void)viewDidLoad
{

    //[self.view setNeedsDisplay];

    Sensor_VisualizationAppDelegate *delegate = (Sensor_VisualizationAppDelegate *)[[UIApplication sharedApplication] delegate];
    valuePass = delegate.valuepass;
    timePass = delegate.timepass;

    NSNumber *value1 = [valuePass objectAtIndex:0];
    NSNumber *value2 = [valuePass objectAtIndex:1];
    NSNumber *value3 = [valuePass objectAtIndex:2];
    NSNumber *value4 = [valuePass objectAtIndex:3];
    NSNumber *value5 = [valuePass objectAtIndex:4];
    NSNumber *value6 = [valuePass objectAtIndex:5];
    NSNumber *value7 = [valuePass objectAtIndex:6];



    NSString *time1 = [timePass objectAtIndex:0];
    NSString *time2 = [timePass objectAtIndex:1];
    NSString *time3 = [timePass objectAtIndex:2];
    NSString *time4 = [timePass objectAtIndex:3];
    NSString *time5 = [timePass objectAtIndex:4];
    NSString *time6 = [timePass objectAtIndex:5];
    NSString *time7 = [timePass objectAtIndex:6];



    OVGraphView *graphview=[[OVGraphView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.height, 300) ContentSize:CGSizeMake(960, 300)];
    graphview.reverse=YES;
    graphview.graphcolor=[UIColor colorWithRed:0.31 green:0.73 blue:0.78 alpha:1.0];
    [self.view addSubview:graphview];
    [graphview setPoints:@[ [[OVGraphViewPoint alloc]initWithXLabel:time1 YValue:value1],
     [[OVGraphViewPoint alloc]initWithXLabel:time2 YValue:value2],
     [[OVGraphViewPoint alloc]initWithXLabel:time3 YValue:value3],
     [[OVGraphViewPoint alloc]initWithXLabel:time4 YValue:value4],
     [[OVGraphViewPoint alloc]initWithXLabel:time5 YValue:value5],
     [[OVGraphViewPoint alloc]initWithXLabel:time6 YValue:value6],
     [[OVGraphViewPoint alloc]initWithXLabel:time7 YValue:value7]
     ]];

[super viewDidLoad];    
}

要检测选项卡栏触摸,可以按如下方式实现UITabBarController委托:

  - (void)tabBarController:(UITabBarController *)tabBarController 
 didSelectViewController:(UIViewController *)viewController
{
    NSLog(@"controller class: %@", NSStringFromClass([viewController class]));
    NSLog(@"controller title: %@", viewController.title);
}
创建选项卡栏的位置。然后,您可以获取视图控制器视图的实例,并调用setNeedsDisplay

在ovgraphview的源代码中,在调用设定点之后的某个地方,此方法被调用:

-(void)setPlotViewPoints:(NSArray *)points Reversed:(BOOL)reversebool{
    if (reversebool) {
       self.plotpoints=[[points reverseObjectEnumerator]allObjects];
    }else{
        self.plotpoints=points;
    }
    spacebetweenpoints=self.frame.size.width/[points count];
    int d=0;
    for (OVGraphViewPoint *pt in points) {
        if ([pt.yvalue intValue]>d) {
            d=[pt.yvalue intValue];
        }
    }
    yscale=(self.frame.size.height-40)/d;
    [self setNeedsDisplay];
}
在最后一行中,您可以看到他们正在调用setNeedsDisplay(设置点后在视图上显示),因此在创建图形之前无需调用它。但既然你这么做了,这似乎破坏了图形的内部植入。当您调用setNeedsDisplay时,它会等待下一个运行循环周期显示,在上述方法中调用的循环也会显示。现在我们在视图层次结构的不同层上调用了不止一个,这会变得很糟糕。我认为这就是问题所在

对于您的情况,我将完全保留setNeedsDisplay,或者只调用我上面给出的委托方法中的设置点,或者如果您没有使用tabbarcontroller,则实现tab bar委托的tabBar:didSelectItem:,通过在创建时为tab bar项指定标记或检查来检测何时单击了选项卡它的标题来验证它是否是您想要的,然后调用设置点


这有点冗长,如果您需要我进一步澄清,请告诉我。

您如何绘制图表?每当您切换到该选项卡时,都会调用viewWillDisplay/viewDidDisplay。viewDidLoad仅在首次加载视图时调用。@JamesP我正在使用一个名为Lemme post the Complete代码的框架来绘制它。但是我应该如何将viewDIdload链接到我的UIview,因为当我尝试将代码复制粘贴到viewDIdload时,什么都没有发生。我不熟悉这一点,但是如果在graphView上调用setNeedsDisplay,而不是self.view,该怎么办呢。(这应该是内部视图将出现)。@JamesP我尝试了[self.graphview setNeedsDisplay];但是什么都没发生。我有点困惑,你到底想要什么,你是在改变数据集吗,否则我猜它只是重新绘制了与以前一样的图形。在添加新图形视图之前,您可以尝试将所有代码移动到ViewWillDisplay并删除旧的图形视图。我必须在何处调用
[self.view setNeedsDisplay]是否在
-(void)viewDidLoad
中,我是指函数中的第一行,因为当我这样做时,我得到了视图,但我的图形没有打印,而是在我注释
[self.view setNeedsDisplay]时我得到图形。因此setNeedsDisplay将为系统设置一个标志来调用该视图的drawRect方法。如何将数据加载到图形中?那么它在viewDidLoad中吗?我已经编辑了上面的问题,它有代码片段,显示了我如何加载图形,是的,它在viewDidLoad中。非常感谢您的帮助。我有一个小小的疑问,因为我对objective-c非常陌生,我应该将您的委托代码准确地粘贴到哪里?它应该在Appdelegate中,还是在我的viewcontroller中,因为我在xcode中使用内置模板创建了一个选项卡式应用程序,并且我的选项卡栏是在Appdelegate中创建的(如果我错了,请纠正我),如果不在Appdelegate中,那么在哪里?我找到了它。非常感谢你的帮助。