在我的应用程序中,我有一些视图控制器和一个目标c类,如何访问一个视图控制器的UI元素以更改其在目标类中的值。
为了进一步解释,我在firstviewcontroller中有一个UILable *实验室,只是导入了
#import "firstViewController.h"
在我的 customclass.m 文件中,我尝试在目标c类的一种方法中执行此类操作
firstViewController.lab.text=@"example";
(我知道它的方法不正确,但我想解释一下我在做什么)
任何人都可以告诉我该怎么做?
答案 0 :(得分:0)
您需要做的第一件事是获取对您希望操作的视图控制器的引用。执行此操作并将其提供给其他类的一种方法是在您在customclass.m中实例化的单个对象中存储对它的引用。具体来说,这就是这种方法的工作原理:
定义Singleton对象:
#import <Foundation/Foundation.h>
@interface MySingleton : NSObject {
MyViewController *myViewController;
}
@propery (nonatomic. retain) MyViewController *myViewController;
+(MySingleton*)sharedMySingleton;
@implementation MySingleton
@synthesize myViewController;
static MySingleton* _sharedMySingleton = nil;
+(MySingleton*)sharedMySingleton
{
@synchronized([MySingleton class])
{
if (!_sharedMySingleton)
[[self alloc] init];
return _sharedMySingleton;
}
return nil;
}
+(id)alloc
{
@synchronized([MySingleton class])
{
NSAssert(_sharedMySingleton == nil, @"Attempted to allocate a second instance of a singleton.");
_sharedMySingleton = [super alloc];
return _sharedMySingleton;
}
return nil;
}
-(id)init {
self = [super init];
if (self != nil) {
// initialize stuff here
}
return self;
}
@end
无论您实例化myViewController,都要执行此操作:
#import "MySingleton.h"
MySingleton *sinlgeton = [MySingleton sharedMySingleton];
singleton.myViewController = myViewController;
现在在CustomClass.m中执行此操作:
#import "MySingleton.h"
MySingleton *sinlgeton = [MySingleton sharedMySingleton];
singleton.myViewController.lab.text = @"example"
正如我所说,这是一种方法。但是,您很可能不希望在自定义类中访问和更改视图控制器属性,因此您应该重新考虑为什么要执行此操作。
答案 1 :(得分:0)
与大多数编程任务一样,有几种解决方案,具体取决于具体情况。
您可以让FirstViewController拥有MyCustomClass的实例,然后自行传递。
@interface FirstViewController : UIViewController {
MyCustomClass *customClass_;
}
@end
@implementation FirstViewController
- (void)viewDidLoad {
[super viewDidLoad];
customClass_ = [[MyCustomClass alloc] init]
customClass_.firstViewController = self;
}
@end
@interface MyCustomClass : NSObject {
FirstViewController *firstViewController;
}
@property (nonatomic, assign) FirstViewController *firstViewController;
@end
这样MyCustomClass可以访问FirstViewController的属性。如果您不想让MyCustomClass访问所有FirstViewController,您可以使用MyCustomClass应该知道的属性传递。
@interface FirstViewController : UIViewController {
MyCustomClass *customClass_;
UILabel *lab;
}
@property (nonatomic, retain) IBOutlet UILabel *lab;
@end
@implementation FirstViewController
- (void)viewDidLoad {
[super viewDidLoad];
customClass_ = [[MyCustomClass alloc] init]
customClass_.lab = self.lab;
}
@end
@interface MyCustomClass : NSObject {
UILabel *lab;
}
@property (nonatomic, retain) IBOutlet UILabel *lab;
@end
很可能是FirstViewController成为MyCustomClass的所有者是没有意义的。也许是AppDelegate或某些父控制器可以访问这两个实例。
@interface RandomParentClass : NSObject {
FirstViewController *firstViewController;
MyCustomClass *customClass:
}
@end
@implementation RandomParentClass
- (void)setUpController {
firstViewController = [[FirstViewController alloc] init];
customClass = [[MyCustomClass alloc] init];
customClass.lab = firstViewController.lab;
// or
customClass.firstViewController = firstViewController;
}
@end