我正在尝试从另一个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'。
我将以何种方式访问其他视图控制器?
答案 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";
希望这不会太长时间。