视图控制器之间的数据传递无效

时间:2013-07-27 02:30:40

标签: ios objective-c iphone cocoa-touch

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

我在两个View Controller头文件中都导入了AppDelegate.h。我在每个标题中都有AppDelegate *appDelegate

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

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

我不知道在传递数据时我做错了什么。我希望floatValue的{​​{1}}可以在我的bmiView.text中使用,这样如果TipsViewController的{​​{1}}是一定金额,它就会显示我floatValue中的正确信息。如果有任何不同,我正在使用故事板。

3 个答案:

答案 0 :(得分:0)

根据您提供的代码,一种可能性是您在为appDelegate.bmiShared分配了值(即它为零)之前尝试为appDelegate分配值。尝试交换这两行,以便

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

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

答案 1 :(得分: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

那应该有用。如果要设置字符串,请导入单例,alloc / init,然后设置bmiShared属性,就像设置任何其他属性一样。对要查看的视图上的访问者执行相同的操作。

答案 2 :(得分:0)

这是今天的第二个问题,你已经就同一主题提出过要求,而且你所做的大部分工作都不对。要在控制器之间传递数据,不应使用应用程序委托,也不应使用单例。你需要做的是回到基础并尝试理解你在做什么。在两个控制器之间传递数据是一个简单的三步过程:

  1. 在“传递给”视图控制器中创建一个属性来保存数据。
  2. 获取您在屏幕上或将拥有的“传递给”控制器的参考。
  3. 使用“来自”控制器中的数据设置您创建的属性的值。
  4. 让大多数新手搞砸的步骤是#2。你不能只为init分配一个“传递给”控制器的实例,你需要获得对你创建的实例的引用,通常是在xib或storyboard中。究竟如何做到这一点取决于这两个控制器如何相互关联。是否创建了另一个的实例然后推送或呈现它?这是“传递给”在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中也有一个属性。 Apple的“适用于iOS的View Controller编程指南”中对此进行了介绍 - 您应该对其进行研究。