spaniard89
spaniard89

Reputation: 307

refreshing a UIview in a tabbed application in ios

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

Upvotes: 1

Views: 200

Answers (1)

Greg Price
Greg Price

Reputation: 2556

To detect tab bar touches you can implement the UITabBarController Delegate as follows:

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

Where you created your tab bar. Then you can get an instance of the view of the view controller and call setNeedsDisplay

In the source code for the ovgraphview, somewhere along the way after you call setPoints this method is called:

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

In the last line you see they are call calling setNeedsDisplay on the view after the points are set, so there is no need for you to call it before the graph is created. but since you did, it appears that this messed with the internal implantation of the graph. When you call setNeedsDisplay it waits until the next run loop cycle to display and so will the one called in the method above. Now we have more than one being called on different layers in the view hierarchy and it gets nasty. I think that is where the problem is.

For your case I would leave setNeedsDisplay out altogether and either just call setPoints in the delegate method I gave above or if you are not using a tabbarcontroller than implement tabBar:didSelectItem: of the tab bar delegate to detect when your tab was clicked either by assigning a tag to the tab bar item when you create it or checking its title to verify its the one you want, then call set points.

This was a bit long winded let me know if you need me to try and clarify it more.

Upvotes: 2

Related Questions