将变量从一个视图传递到另一个视图

时间:2010-08-23 07:46:52

标签: iphone objective-c

我知道这个问题一直被问到,但它对我来说仍然很模糊,所以我想用我的代码做一个例子可能会更容易。

我知道你可以使用:

  • 全局变量,(不是很好的做法)。
  • 使用代理
  • 使用单身人士

说我在第一个视图控制器标题中有这段代码:

#import <UIKit/UIKit.h>


@interface FirstViewController : UIViewController {

    IBOutlet UITextField *Te;
NSInteger evTe;
}


@property (nonatomic, retain) UITextField *Te;
@property (nonatomic) NSInteger evTe;


- (IBAction) makeKeyboardGoAway;

@end

然后在我的实现文件中

#import "FirstViewController.h"


@implementation FirstViewController

@synthesize Te;

- (IBAction) makeKeyboardGoAway;
{
    [Te resignFirstResponder];  
    evTe = [Te.text intValue];
}

如何在SecondViewController中调用 evTe ? (也许使用代表?)。

这是我在第二个视图Controller中得到的,标题:

@interface SecondViewController : UIViewController {


        NSInteger evTe;

}



@property (nonatomic) NSInteger evTe;

和实施:

- (IBAction) makeKeyboardGoAway;
{



    FirstViewController *first = [[FirstViewController alloc] init];
    first.evTe = self.evTe;

    NSLog(@"second value is %i",evTe);

}

非常感谢!


编辑Tob

FirstViewController.m

- (IBAction) makeKeyboardGoAway;
{
    evTe = [Te.text intValue];
    NSLog(@"The value of integer num is %i", evTe);

    NSDictionary *changedValues = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:evTe] forKey:@"evTe"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"evTeChanged" object:self userInfo:changedValues];


}

SecondViewController.m

 - (void)viewDidLoad {
     [super viewDidLoad];
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(methodToCall:) name:@"evTeChanged" object:nil];

 }

- (void)methodToCall:(NSNotification *)aNotification{

    NSDictionary *changedValues = [[aNotification userInfo]  objectForKey:@"evTe"];               
    NSString *dictionaryString = [changedValues description];
    NSLog(@"Notification returning %d",dictionaryString);

}

不幸的是我没有从SecondView获取任何日志..

2 个答案:

答案 0 :(得分:0)

看看NSNotification。您应该发送特定值已更改的通知,并在第二个视图控制器中注册该通知。

- (IBAction) makeKeyboardGoAway;
{
    [Te resignFirstResponder];  
    evTe = [Te.text intValue];

    NSDictionary *changedValues = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:evTe] forKey:@"evTe"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"evTeChanged" object:self userInfo:changedValues];

}

在其他控制器的viewDidLoad方法中执行:

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

现在,每当第一个控制器调用makeKeyboardGoAway时,方法- (void)methodToCall:(NSNotification *)aNotification都将被调用。

实施此方法,并在发布通知之前向aNotification询问其userInfo,即您在第一个控制器中创建的NSDictionary。从中获取evTe值并对该值执行任何操作。

答案 1 :(得分:0)

在两个视图控制器中创建一个名为evTe的@property。

如果FirstViewController负责创建SecondViewController,您可以将evTe的值存储在FirstViewController的属性中,然后在创建SecondViewController之后,也可以在那里设置evTe属性。

- (IBAction) makeKeyboardGoAway;
{
    [Te resignFirstResponder];  
    self.evTe = [Te.text integerValue];
}

//创建SecondViewController的其他方法

SecondViewController* second = [[SecondViewController alloc] init];
second.evTe = self.evTe;
// do what ever

- 编辑 -

@interface FirstViewController : UIViewController {

    IBOutlet UITextField *Te;
    NSInteger evTe;

}

@property (nonatomic, retain) UITextField *Te;
@property (nonatomic) NSInteger evTe;