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

时间:2013-01-18 16:54:21

标签: ios objective-c uiview refresh

我有一个带有两个标签的标签式应用程序。

在第二个标签上,我绘制了一个图表。

但每次按此选项卡时,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];    
}

1 个答案:

答案 0 :(得分: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:标签栏委托来检测你的标签被点击的时间通过在创建标签栏项目时为标签栏项目指定标签或检查其标题以验证其所需项目,然后调用设定点。

如果您需要我尝试更多地澄清它,请告诉我。