0

我的 AppDelegate.h 中的属性:@property (retain, nonatomic) NSString *bmiShared;(它是在我的..中合成的AppDelegate.m。)

我已经AppDelegate.h导入了两个 View Controller 头文件。我也有AppDelegate *appDelegate每个标题。

在两个实现文件ViewController.mTipsViewController.m中,我都有:

appDelegate.bmiShared = bmiView.text;
appDelegate = [[UIApplication sharedApplication] delegate];

我不知道在传递数据时我做错了什么。我希望floatValueofbmiView.text可以在 my 中使用,TipsViewController这样如果floatValueofbmiView.text是一定数量,它将在 my 中显示正确的信息TipsViewController view。如果这有什么不同,我正在使用故事板。

4

3 回答 3

0

这是您今天就同一主题提出的第二个问题,您所做的大部分事情都是不对的。要在控制器之间传递数据,您不应该使用应用程序委托,也不应该使用单例。您需要做的是回到基础并尝试了解您在做什么。在两个控制器之间传递数据是一个简单的 3 步过程:

  1. 在“传递给”视图控制器中创建一个属性来保存数据。
  2. 获取对您在屏幕上拥有或将拥有的“传递给”控制器的引用。
  3. 使用来自“传递自”控制器的数据设置您创建的该属性的值。

让大多数新手感到困惑的步骤是#2。您不能只分配初始化“传递给”控制器的实例,您需要获取对您创建的实例的引用,通常在 xib 或情节提要中。究竟如何做到这一点取决于这两个控制器如何相互关联。是否创建另一个实例然后推送或呈现它?是在 xib、情节提要还是代码中创建的“传递给”控制器?控制器是嵌入在导航控制器还是标签栏控制器中?您是在代码中还是直接使用 segues 移动到第二个控制器?这些是您需要考虑并了解如何回答的问题,因此您可以使用您拥有的任何设置来解决问题。

如果您可以解释您的控制器设置(两者如何相互关联,以及您在哪里制作它们),我可以为您指出第 2 步的更具体答案。

编辑后:

当您在带有 segue 的视图之间移动时,您传递数据的地方是 prepareForSegue。TipsViewController 将是 segue.destinationViewController,所以你可以这样做:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"segueName"]) {
        TipsViewController *tipsVC = [segue destinationViewController];
        tipsVC.bmi = self.bmi;
    }
}

此示例假设您在 TipsViewController 中创建了一个名为 bmi 的属性,并且您在 ViewController 中也有一个名为 bmi 的属性。这在 Apple 的“iOS 视图控制器编程指南”中都有介绍——你应该学习它。

于 2013-07-27T04:51:00.317 回答
0

根据您提供的代码,一种可能性是您试图在分配值appDelegate.bmiShared之前appDelegate分配一个值(即它为 nil)。尝试交换这两行,这样你就有了

self.appDelegate = [[UIApplication sharedApplication] delegate];
self.appDelegate.bmiShared = bmiView.text;

还有很多其他的事情可能会出错,但是如果没有看到你所有的代码,这似乎是最有可能的解释。

于 2013-07-27T03:03:14.120 回答
0

如果你想跨视图控制器传递数据,你应该考虑使用单例。

Singleton.h
@property (nonatomic, strong) NSString *bmiShared;
+(Singleton *)sharedStore;

#import "Singleton.h"

@implementation Singleton

+(Singleton *)sharedStore
{
    static Singleton *sharedStore = nil;

    if (!sharedStore) {
        sharedStore = [[super allocWithZone:nil] init];
    }

    return sharedStore;
 }

+(id)allocWithZone:(NSZone *)zone
{
    return [self sharedStore];
}

-(id)init
{
    self = [super init];

    if (self) {
        _bmiShared = [[NSString alloc] init];
}

    return self;
}
@end

那应该行得通。当您想设置字符串时,导入单例,分配/初始化它,然后像设置任何其他属性一样设置 bmiShared 属性。对要查看的视图上的访问器执行相同的操作。

于 2013-07-27T04:02:48.750 回答