访问另一个viewcontroller

时间:2013-01-12 15:28:30

标签: ios cocoa-touch uikit viewcontroller

我正在尝试从另一个viewcontroller(iOS)访问一些东西。

我有我的ViewController.h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate> {
    ...
}

@end

ViewController.m:

#import "ViewController.h"
#import "ViewController2.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
   ViewController2.someVar = @"cakes"; // this is where I'm trying to set something in vc2
}

ViewController2.h:

#import <UIKit/UIKit.h>

@interface ViewController2 : UIViewController <UITableViewDataSource, UITableViewDelegate, UISearchDisplayDelegate>
{
   ...
}

@property (nonatomic, copy) NSString *someVar;

@end

ViewController2.m:

#import "ViewController2.h"

@interface ViewController2 ()

@end

@implementation ViewController2

@synthesize someVar;

etc.

但是在我尝试访问此var的行中,它给出了以下错误:

在'ViewController2'类型的对象上找不到属性'someVar'。

我将以何种方式访问​​其他视图控制器?

2 个答案:

答案 0 :(得分:3)

您必须在ViewControlle2中创建Viewcontroller.m个对象。

ViewController2 *myVC2 = [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil];
myVC2.someVar = @"cakes";

答案 1 :(得分:3)

另一种方法是使用委托。如果您在AppDelegate中创建了ViewController1,那么您还应该在AppDelegate中创建ViewController2,或者创建ViewControllers。然后,ViewController1将向AppDelegate发送消息以从ViewController2获取数据,反之亦然。这使得ViewController1和ViewController2不再相互依赖。

所以在AppDelegate.h中我们有这样的东西

@interface AppDelegate : NSObject <MyViewControllerDelegate>

@property (nonatomic) ViewController1 *viewController1;
@property (nonatomic) ViewController2 *viewController2;

@end

然后在两个视图控制器中,您可以在.h

中添加此行
@property (nonatomic) id<MyViewControllerDelegate> delegate;

这只是给我们一个变量,用于从ViewController的.m

中引用委托。

您还需要创建MyViewControllerDelegate协议,因此在名为MyViewControllerDelegate.h的文件中

@protocol MyViewControllerDelegate

- (ViewController1 *) viewController1;

- (ViewControlelr2 *) viewController2;

@end

然后在AppDelegate.m中创建ViewControllers时,还应将AppDelegate设置为ViewController的委托。

self.viewController1 = [[ViewController1 alloc] init];
self.viewController1.delegate = self;
self.viewController2 = [[ViewController2 alloc] init];
self.viewController2.delegate = self;

所以完成所有这个委托设置后,你应该能够通过使用以下方式从viewController1访问viewController2.someVar到委托:

self.delegate.viewController2.someVar = @"Cakes";

希望这不会太长时间。