Iphone 视图未在tabbar应用程序中更新

Iphone 视图未在tabbar应用程序中更新,iphone,cocoa-touch,uiviewcontroller,uitabbarcontroller,Iphone,Cocoa Touch,Uiviewcontroller,Uitabbarcontroller,我一直在开发一个tabbar应用程序,它有一个让我(仍然)困惑的bug 当我移动到一个新的选项卡时,存储在应用程序模型部分的数据不会被视图使用,因此它会显示过时的信息(图形、数字等)。我尝试了两种强制更新的方法,在视图中由[self-updateDisplay]处理。(1) 在应用程序委托中,使用UITABBARCONTROLLEDELEGATE方法确定选择了哪个选项卡,然后向其发送更新消息。下面是委托方法主体的一部分: if (viewController == [tabBarControll

我一直在开发一个tabbar应用程序,它有一个让我(仍然)困惑的bug

当我移动到一个新的选项卡时,存储在应用程序模型部分的数据不会被视图使用,因此它会显示过时的信息(图形、数字等)。我尝试了两种强制更新的方法,在视图中由
[self-updateDisplay]
处理。(1) 在应用程序委托中,使用
UITABBARCONTROLLEDELEGATE
方法确定选择了哪个选项卡,然后向其发送更新消息。下面是委托方法主体的一部分:

if (viewController == [tabBarController.viewControllers objectAtIndex:1]) {
    NSLog(@"graphViewController selected, graphViewController = %@", graphViewController);
    [graphViewController updateDisplay];                    
}
这是我想做这项工作的方式。但是,尽管NSLog确认已启动updateDisplay,但显示不会更新

(2) 按视图中的按钮,通过执行
[self-updateDisplay]
更新显示。这是可行的,但并不令人满意。现在是有趣的部分。在下面的日志中,我们看到(1)调用委托方法,(2)选择
graphViewController
,以及(3)调用graphViewController的updateDisplay方法。伟大的但是,
barGraph
此时为空,并且包含从
ourLog
中的浮动读取的标签的显示不会更新。对象
ourLog
是模型的一部分,它与“磁盘”上的文件同步。(
barGraph
通过
updateDisplay
ourLog
更新)

继续,我们现在在GraphViewController管理的视图中,我们按下“测试”按钮(6),
updateDisplay被调用,视图被正确更新

注意,在1--5中,
GraphViewController
位于0x4e346e0,而在6--9中,它位于0x4b53c80。如果你来回切换,按“测试”按钮,你总是得到十六进制数。起初我以为有两个
GraphViewController
实例在浮动。但是我重写了该类的
init
方法,以便记录它。它只出现一次。所以我完全被难住了

--吉姆

  • 1] 调用了UITabBarControllerDelegate方法,self=
  • 2] 已选择graphViewController,graphViewController=
  • 3] GraphViewController,已调用updateDisplay,self=
  • 4] 我们的日志:
  • 5] 更新显示,条形图:(空)
  • 6] 测试推动
  • 7] GraphViewController,已调用updateDisplay,self=
  • 8] 我们的日志:
  • 9] 更新显示,条形图:>
我最初把这个贴在了。我之所以重新发布这篇文章,是因为问题更为普遍,
barGraph
在应用程序生命周期的各个点都是空的。不知何故,当我调用它时需要访问的东西是不可访问的,所以我必须找到一种不同的调用方式。但它并没有消失(我也覆盖了
dealoc
,并且没有发现
barGraph
被发布过)

附录1:条形图。

以下是如何在GraphViewController中创建条形图:

@interface GraphViewController : UIViewController {

BarGraph *barGraph;

}

@property (nonatomic, retain) BarGraph *barGraph;

@property (nonatomic, retain) IBOutlet UIButton *testButton;

- (void) updateDisplay;
- (IBAction) testAction: (id) sender;

@end
@implementation
中,
viewDidLoad
alloc inits条形图:

- (void) viewDidLoad {
    [super viewDidLoad];
    NSLog(@"xx:BARGRAPH: alloc-init in viewDidLoad, GraphBar");
    barGraph = [[BarGraph alloc] initWithFrame:CGRectMake(15, 140, 289, 130)];
    [self.view addSubview:barGraph];    
    [self updateDisplay];
}
最后,这里是
updateDisplay
的实现:

- (void) updateDisplay {

    // Check to see where GraphViewController is:
    NSLog(@"GraphViewController, updateDisplay called, self = %@", self);

    // Get a pointer to the current data to graph
    Log *ourLog = [self theDelegate].currentLog

    // Log info
    NSLog(@"ourLog: %@", ourLog);
    NSLog(@"updateDisplay, barGraph: %@", self.barGraph);

    // Get the current data out of ourLOg
    self.barGraph.data = ourLog.log;
    // And ask barGraph to display it
    [barGraph setNeedsDisplay];
}
附录2:视图将出现。

我将
viewwillbeen
添加到
GraphViewController.m
中,如下所示:

- (void) viewWillAppear:(BOOL)animated
{
     NSLog(@"xx: GraphViewController, viewWillAppear has fired");
     [super viewWillAppear:animated];
     [self updateDisplay];
}
这似乎是正常且最好的解决方案,但此
视图将出现
从不触发。注意方法
测试操作
,该方法通过按钮激活:

- (IBAction) testAction: (id) sender {
    NSLog(@"test pushed");
    [self updateDisplay];
}

按下已连接的按钮可正确更新显示器。但我当然希望iOS按下按钮,而不是我:-)

管理该选项卡的UIViewController应该有一个对自定义UIView的引用。在UIViewController的-viewWillExample方法中,可以调用-updateDisplay。我假设条形图是对自定义视图的引用。如果要在xib中创建它,只需确保将它连接到IBOutlet,并且该outlet的@property设置为retain。如果您不是在xib中创建条形图,那么我假设您是在viewDidLoad中创建的。无论哪种方式,请确保将其设置为@property


如果您不是以任何方式创建它,那么您是如何创建它的?

管理该选项卡的UIViewController应该具有对自定义UIView的引用。在UIViewController的-viewWillExample方法中,可以调用-updateDisplay。我假设条形图是对自定义视图的引用。如果要在xib中创建它,只需确保将它连接到IBOutlet,并且该outlet的@property设置为retain。如果您不是在xib中创建条形图,那么我假设您是在viewDidLoad中创建的。无论哪种方式,请确保将其设置为@property


如果您不是以任何方式创建它,那么您是如何创建它的?

您好,我正在GraphViewController中以渐进方式创建一个barGraph实例(barGraph是我在其他应用程序中使用的自定义视图)。我已经在附录1中发布了上面的一些相关代码。我也尝试过ViewWillEmbeen,但它似乎从未被调用过。我会再看看这个。谢谢我插入的视图将根据上述附录2显示。唉,它从不开火。如果我能让它这样做,这可能会解决我的问题。我可以通过从UITabBarDelegate方法调用它来手动启动它——但是当GraphViewController的视图出现时启动,随后调用updateDisplay,旧的问题会以稍微不同的方式产生。我相信iOS必须调用这个方法。我发现了这个:并检查了它。在IB中正确设置了类名。仍有问题!也许这就是为什么
视图将出现
视图显示
不触发的原因:(“技术视图仍然可见”,即在另一个视图后面)。如果是这样,那么我将不得不寻找另一种解决方案,让
updateDisplay
在适当的时候启动。因为当通过按下按钮手动激活时,它确实起作用