1

I have a tabbed application with two tabs.

on the second tab, I plot a graph.

But every time I press this tab, the UIview is not getting refreshed.

I tried,

[self.view setNeedsDisplay]

inside

- (void)viewDidLoad

but still it was not refreshed.

I tried pasting the code from - (void)viewDidLoad to -(void)viewDidAppear

But nothing happened.

Awaiting an answer.

Edit: The whole source code

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

1 回答 1

2

要检测标签栏触摸,您可以实现 UITabBarController 委托,如下所示:

  - (void)tabBarController:(UITabBarController *)tabBarController 
 didSelectViewController:(UIViewController *)viewController
{
    NSLog(@"controller class: %@", NSStringFromClass([viewController class]));
    NSLog(@"controller title: %@", viewController.title);
}

您创建标签栏的位置。然后可以获取视图控制器的视图实例并调用 setNeedsDisplay

在 ovgraphview 的源代码中,在调用 setPoints 之后的某个地方调用此方法:

-(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 ,或者只在我上面给出的委托方法中调用 setPoints ,或者如果您没有使用 tabbarcontroller 而不是实现 tabBar:didSelectItem: 的标签栏委托来检测您的标签何时被点击,或者通过分配创建标签栏项目时为其添加标签或检查其标题以验证其是否为您想要的标签,然后调用设置点。

这有点啰嗦,如果您需要我尝试进一步澄清,请告诉我。

于 2013-01-18T17:09:28.067 回答