如何在两个viewcontroller之间传递变量?

时间:2009-02-13 08:16:56

标签: cocoa-touch

我想将一个变量从viewcontroller传递到另一个我的方式 在第一个viewcontroller头文件中我声明了一个变量

1.H:

NSString * string;

并且在第二个viewcontroller我已经在我的2.m文件中导入了1.h,我调用变量的方式是

2.M:

NSString * string2 = 1.string

然而它返回错误可以有人教我怎么做,因为我没有在面向对象编程的强大基础,谢谢

2 个答案:

答案 0 :(得分:1)

仅仅定义和声明两个字符串是不够的。这可以确保每个类都有一个名为string或string2的变量 - 但是当程序运行时,它是必须引用string1(或string2)的特定实例的实际对象。

这就像设计一个带信箱的房子 - 信箱就在房子的计划上,但是在特定信件发送到特定房屋之前没有任何事情发生。

你需要做的是连接你的类的实际实例,可能在init方法中,如下所示:

// 1.h

@interface ViewController1 : UIViewController
{
// declare our variable
NSString* string1;
}

// declare 'string1' as a property
@property (retain) NSString* string1;

// 1.m
// implements the property for string1
@synthesize string1;

// 2.h
@interface ViewController2 : UIViewController
{
// declare our variable
NSString* string2;
}

// declare 'string2' as a property
@property (retain) NSString* string2;

// 2.m

- (id)initWithTitle:(NSString*)aTitle andString1:aString
    {
if (self = [super init])
    {
        self.title = aTitle;
        self.string1 = aString;
    }

return self;
}

然后在1.m中,您创建第二个控制器,然后将字符串连接起来,如下所示:

// 1.m
mySecondController = [[ViewController2 alloc] initWithTitle:@"Controller 2" andString:string1];

答案 1 :(得分:0)

虽然可以直接访问这样的成员变量(使用 - >运算符),但不建议这样做。

正确的方法是提供一个访问器来获取/设置您的成员变量。

在Objective-C 2.0(iPhone和OSX 10.5)中,您可以使用“property”关键字轻松完成此操作。作为属性语法的一部分,您还可以表达您希望如何处理“设置”对象。

保留 - 将释放上一个对象并保留新对象 copy - 将复制对象 assign - 将分配对象。

这些是基础知识,我建议你阅读更多关于属性的内容。

下面显示了如何在示例中使用属性。请注意,因为我们正在处理NSString,它是一个NSObject派生类,所以我们使用“retain”选项来确保正确更新引用计数。

// 1.h

@interface ViewController1 : UIViewController
{
// declare our variable
NSString* _string;
}

// declare 'string' as a property
@property (retain) NSString* string;

// 1.m
// implements the property for string
@synthesize string = _string;

// constructor for ViewController1
-(id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
  if (self = [super initWithNibName: name bundle: bundle]) {
    // Initialize the string here.
    self.string = @"Hello World";
  }
}

// 2.m
NSString* oldString = view.string;
view.string = @"New String";