2

我正在尝试从另一个视图控制器(iOS)访问一些东西。

我有我的 ViewController.h:

#import <UIKit/UIKit.h>

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

@end

视图控制器.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”。

我将以什么方式访问这个其他视图控制器?

4

2 回答 2

3

您必须ViewControlle2Viewcontroller.m.

ViewController2 *myVC2 = [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil];
myVC2.someVar = @"cakes";
于 2013-01-12T15:34:17.313 回答
3

另一种方法是使用委托。如果您在 AppDelegate 中创建了 ViewController1,您还应该在 AppDelegate 中创建 ViewController2,或者在您创建 ViewController 的任何地方创建。然后您 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";

希望这不会太啰嗦。

于 2013-01-12T21:51:09.733 回答