1

2つのタブがあるタブ付きアプリケーションがあります。

2番目のタブで、グラフをプロットします。

しかし、このタブを押すたびに、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];    
}
4

1 に答える 1

2

タブバーのタッチを検出するには、次のようにUITabBarControllerデリゲートを実装できます。

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

タブバーを作成した場所。次に、View Controllerのビューのインスタンスを取得し、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を呼び出すか、タブバーコントローラーを使用していない場合は、タブバーデリゲートのtabBar:didSelectItem:を実装して、次のいずれかを割り当ててタブがクリックされたことを検出します。タブバーアイテムを作成するとき、またはタイトルをチェックして目的のアイテムを確認するときにタブバーアイテムにタグを付けてから、セットポイントを呼び出します。

これは少し長かったので、もっと明確にする必要があるかどうか教えてください。

于 2013-01-18T17:09:28.067 に答える