【问题标题】:Accessing variable values from one view in another从另一个视图中的一个视图访问变量值
【发布时间】:2012-04-22 07:14:55
【问题描述】:

我在理解变量值如何从一个视图传递到另一个视图时遇到了一些麻烦。我在用户输入数字的第一个视图中有一个 UITextField。当用户点击一个按钮时,该数字乘以 2,结果显示在第二个视图的 UILabel 上。这就是我目前所拥有的

FirstViewController.h

@interface FirstViewController : UIViewController{
UITextField *numberTextField;
NSNumber *aNumber;
}
@property (nonatomic, retain) IBOutlet UITextField *numberTextField;
@property (nonatomic) NSNumber *aNumber;
-(IBAction)calculate;
@end

FirstViewController.m

@implementation FirstViewController
@synthesize numberTextField,  aNumber;

-(double)doubleNumber{
double number = [numberTextField.text doubleValue] * 2;
return number;
}

-(IBAction)calculate{
self.aNumber = [NSNumber numberWithDouble:[self doubleNumber]];   
}

//more default code continues below

SecondViewController.h

#import "FirstViewController.h"

@interface SecondViewController : FirstViewController{
UILabel *numberLabel;
}
@property (nonatomic, retain) IBOutlet UILabel *numberLabel;
@end

SecondViewController.m

@implementation SecondViewController
@synthesize numberLabel;

- (void)viewDidLoad
{
[super viewDidLoad];
numberLabel.text = [NSString stringWithFormat:@"%@",aNumber];
}

【问题讨论】:

  • SecondView 控制器是如何被实例化的?我假设 FirstViewController 可以吗?
  • 您也可以将文本变量的assign属性设置为在其他类中使用。

标签: iphone objective-c xcode ipad uiviewcontroller


【解决方案1】:

在全球范围内存储价值的最佳和简便方法

用你的关键字设置你的对象

[[NSUserDefaults standardUserDefaults] setObject:@"Ajay" forKey:@"name"]; 

比在项目中的任何位置获取该对象

NSString *name = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];

【讨论】:

  • 如果例如用户返回到 firstviewcontroller 并输入一个新数字进行计算,我将如何重置 secondviewcontroller 中的标签?
  • 只需在 -(void)ViewdidAppear{mylbl.text = [[NSUserDefaults standardUserDefaults]objectForKey:@"name"]} 中执行此操作
  • 我会说“简单”,但绝对不是最好的。大多数时候他们是个坏主意 - c2.com/cgi/wiki?GlobalVariablesAreBad
【解决方案2】:

你应该通过使用 segue 来完成你想要的。在你的故事板中创建一个 segue,然后在你的 firstviewcontroller 中使用- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender 调用它。然后要传递数据,请导入带有要传递的值的属性的 secondviewcontroller.h 文件并设置 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

在该方法中,您可以使用 [segue.destinationViewController ###call the setter for the property in your secondViewController.h file###]; 传递东西

如果不清楚,或者您需要更多帮助,请告诉我。

【讨论】:

    【解决方案3】:

    我假设 FirstViewController 正在实例化 SecondViewController。如果是这样,那么您只需使用附加属性将 aNumber 传递给 SecondViewController:

    // add an additional property to the SecondViewController
    @property (nonatomic, retain) NSNumber *aNumber;
    

    当您在 FirstViewController 中实例化 SecondViewController 时,您只需在加载之前将该值传递给 SecondViewController:

    // inside FirstViewController 
    SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    secondViewController.aNumber = aNumber;
    
    // inside SecondViewController
    - (void)viewDidLoad 
    { 
        [super viewDidLoad]; 
        numberLabel.text = self.aNumber; 
    }
    

    【讨论】:

      【解决方案4】:

      嗯...注意不要混淆视图和视图控制器!!!

      viewController 可以管理的不仅仅是一个视图。例如,在您的代码中,您有一个 UITextField、一个 UILabel 并且可能还有一个 UIButton。这些都是由两个viewsController(FirstViewController 和SecondViewController)管理的视图。

      只要您可以使用的视图很少,您就可以只使用一个 viewController 并将您想要的值直接传递给您的 UILabel:

      - (void)calculateAndPassValue
      {
          aNumber = [NSNumber numberWithDouble:[self doubleNumber]];
          numberLabel.text = [NSString stringWithFormat:@"%@",aNumber];
      }
      

      否则,如果您的目标是将变量值从一个视图控制器传递到另一个视图控制器。嗯...有很多方法可以获得它,例如:

      1. 创建一个 ivar。
      2. 使用单例。
      3. 将数据保存在 NSUserDefault 中。
      4. 在磁盘上创建数据库。

      如果您需要在应用运行时管理数据,则第一种和第二种情况都很好。第三和第四,如果您想记住数据以备将来使用并在下次启动时检索它们。

      尝试搜索 ivar、singleton、NSUserDefault 等键,您会发现许多讨论和示例代码行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-12
        • 1970-01-01
        • 1970-01-01
        • 2013-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多