как получить доступ к элементам пользовательского интерфейса одного viewcontroller из целевого класса c? - PullRequest
1 голос
/ 08 ноября 2010

В моем приложении у меня есть несколько контроллеров представления и один целевой класс c, как я могу получить доступ к элементам пользовательского интерфейса одного контроллера представления, чтобы изменить их значения в целевом классе.

Чтобы объяснить дальше, у меня есть UILable * лаборатория в firstviewcontroller и только что импортированная

#import "firstViewController.h"

в моем customclass.m файле, и я пытаюсь сделать это в одном из методов класса c класса

 firstViewController.lab.text=@"example"; 

(я знаю, что это неправильный метод, но я пытаюсь объяснить, что я делаю)

Может кто-нибудь сказать, пожалуйста, как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2010

Как и в большинстве задач программирования, существует несколько решений, и это зависит от ситуации.

Вы можете настроить 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
0 голосов
/ 08 ноября 2010

Первое, что вам нужно сделать, это получить ссылку на контроллер вида, с которым вы хотите работать.Один из способов сделать это и сделать его доступным для других классов - это сохранить ссылку на него в одноэлементном объекте, который вы создаете в своем файле 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.м вы делаете это:

#import "MySingleton.h"

    MySingleton *sinlgeton = [MySingleton sharedMySingleton];
    singleton.myViewController.lab.text = @"example"

Как я уже сказал, это ОДИН СПОСОБ сделать это.Однако вам, скорее всего, НЕ НУЖНО обращаться к свойствам контроллера представления в пользовательском классе и изменять их, поэтому вам следует по-настоящему переосмыслить, почему вы делаете это вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...