如何从目标c类访问一个viewcontroller的UI元素?

时间:2010-11-08 15:34:06

标签: iphone ios4

在我的应用程序中,我有一些视图控制器和一个目标c类,如何访问一个视图控制器的UI元素以更改其在目标类中的值。

为了进一步解释,我在firstviewcontroller中有一个UILable *实验室,只是导入了

#import "firstViewController.h"

在我的 customclass.m 文件中,我尝试在目标c类的一种方法中执行此类操作

 firstViewController.lab.text=@"example"; 

(我知道它的方法不正确,但我想解释一下我在做什么)

任何人都可以告诉我该怎么做?

2 个答案:

答案 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