iPhone:从另一个类访问一个类

时间:2009-07-23 02:29:13

标签: iphone class

我想创建一个解析XML文件的程序,然后更新2个不同标签栏视图上的标签。在这两个视图中,我都有一个刷新按钮来更新结果。我想要做的是从任一视图更新两个视图标签。我认为AppDelegate可能是一个很好的选择,但我尝试创建AppDelegate可以访问的类,但由于它们是类的实例,因此它们不包含任何值。我没有错误,但即使数据发生变化,标签也不会更新。这是我的AppDelegate中解析XML后调用的方法:

-(void)callUpdateValues {
    NSLog(@"Calling Update from AppDelegate");
    home *homeController;
    data *dataController;
    [homeController updateValues];
    [dataController updateValues];
    }

其中一种更新方法如下:

- (void)updateValues {
NSLog(@"Call Home");
[label1 setText: [[[[totalData objectAtIndex:0] objectForKey:@"nodeChildArray"] objectAtIndex:7] valueForKey:@"nodeContent"]];
[label2 setText:[[[[totalData objectAtIndex:0] objectForKey:@"nodeChildArray"] objectAtIndex:1] valueForKey:@"nodeContent"]];
}

因此视图调用AppDelegate方法“callUpdateValues”,然后该方法应在每个视图中调用单独的“updateValues”方法。我无论如何都不是这方面的专家,我真的只是想知道iPhone上的编程是如何工作的。我可能只是在这里不了解一些东西,如果有人能给我某种答案,我会很感激。

3 个答案:

答案 0 :(得分:1)

Cocoa有许多课程可用于通知感兴趣的各方变更。直接调用你描述的方法可以使事情与你需要的联系更紧密。

在生成更新的方法中:

[[NSNotificationCenter defaultCenter] postNotificationName:@"IGotSomeNewData"
                                                    object:newData
                                                  userInfo:nil];

在想要了解更新的课程中,您需要注册通知:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(newStuff:)
                                             name:@"IGotSomeNewData" object:nil];

然后实现在发生某事时调用的方法:

- (void) newStuff: (NSNotification *)notification {
  id newData = [notification object];
  // Do stuff
}

答案 1 :(得分:0)

Apple在iPhone上为XML做了一些非常棒的事情:XML Reading Material

第一个代码段不合适。我认为您缺少的是您需要在AppDelegate.h中创建实例,使用属性公开它们(并在.m中合成它们)。那么你的更新结构应该更合适。

如果您只是选择iPhone编程,请开始深入了解苹果提供的指南,即使您不参与,也要开始每天至少下拉5个示例代码项目。它们的美妙之处在于你可以构建它们(甚至是你的iphone),如果你喜欢它的功能,你可以看到它是如何完成的。或者,从APRESS获取葡萄柚书。 Beginning iPhone。 希望这有帮助。

答案 2 :(得分:0)

在您提供的示例中,homeControllerdataController未正确初始化。如果我正确理解了您的项目,您将在主XIB文件中创建homeControllerdataController类的实例,并将它们连接到相应的视图(label1和{{1 }})。那么你的AppDelegate应该是这样的:

label2

有了这个,您可以添加(在您的应用程序XIB文件中)从... @class homeController; @class dataController; @interface AppDelegate { IBOutlet homeController * home; IBOutlet dataController * data; } ... @end homeController个实例到相应插座的链接(标记为dataController和{{1} })在您的应用程序委托中。

然后,您只需在home方法中按名称引用它们:

data

另外,Cocoa编码标准通常指定类名称是大写的。当然,这取决于您的个人品味,但如果您刚刚开始使用Cocoa,那么此时可能还需要再喝一杯kool-aid,这样您的代码就会“适应”什么大多数其他开发人员正在做再一次,完全取决于你!