【问题标题】:refreshing a UIview in a tabbed application in ios在 ios 的选项卡式应用程序中刷新 UIview
【发布时间】:2013-01-02 10:42:45
【问题描述】:

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

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

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

【问题讨论】:

  • 你是如何绘制图表的?每当您切换到该选项卡时,都会调用 viewWillAppear/viewDidAppear。 viewDidLoad 只会在第一次加载视图时调用。
  • @JamesP 我正在使用一个名为OVGraphView 的框架来绘制它,让我发布整个代码。但是我应该如何将 viewDIdload 链接到我的 UIview,因为当我尝试将代码复制粘贴到 ViewDidLoad 中时,什么也没发生。
  • 我对此并不熟悉,但是如果你在你的graphView 上调用setNeedsDisplay,而不是self.view 会怎样。 (这应该在 viewWillAppear 内)。
  • @JamesP 我试过 [self.graphview setNeedsDisplay];但什么也没发生。
  • 我对您实际想要什么感到有些困惑,您是否正在更改数据集,否则我猜它只是像以前一样重绘图形。您可以尝试将所有代码移至 viewWillAppear 并删除旧的图表视图,然后再添加新的。

标签: ios objective-c uiview refresh


【解决方案1】:

要检测标签栏触摸,您可以按如下方式实现 UITabBarController Delegate:

  - (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: 的标签栏委托来检测您的标签何时被点击通过在创建标签栏项目时为其分配标签或检查其标题以验证其是您想要的,然后调用设置点。

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

【讨论】:

  • 我必须在哪里调用[self.view setNeedsDisplay]; 它会在- (void)viewDidLoad 内吗,我的意思是函数中的第一行,因为当我这样做时,我得到了视图,但我的图表不是绘制,但是当我评论 [self.view setNeedsDisplay]; 时,我得到了图表。
  • 因此 setNeedsDisplay 将设置一个标志,让系统调用该视图的 drawRect 方法。您如何将数据加载到图表中?那么它在 viewDidLoad 中吗?
  • 我在上面编辑了我的问题,它有代码 sn-p 并显示了我如何加载我的图表,是的,它在 ViewDidload 中。
  • 非常感谢您帮助我。我有一个小小的疑问,因为我对objective-c非常陌生,我应该在哪里准确粘贴你的委托代码?它应该在 Appdelegate 中还是在我的视图控制器中,因为我使用 xcode 中的内置模板创建了一个选项卡式应用程序,并且我的选项卡栏是在 Appdelegate 中创建的(如果我错了,请纠正我),如果不是在 Appdelegate 中,那么在哪里呢?
  • 我想通了,伙计。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多