viewcontrollers中的公共类更新控件

时间:2014-11-01 02:58:46

标签: ios xcode

我是一位经验丰富的开发人员,使用多种语言,但在Xcode for IOS中开发相当新。

我有一个问题,我一直试图解决几个星期了。我已尝试过本网站和其他网站的几个概念,但无济于事。

不要张贴我尝试过的所有例子,而是让我概述一下我想要完成的事情。任何人都可以提供一些关键词来搜索,或者链接到我正在寻找的类似的东西吗?

我有一些视图控制器和一个用于处理的公共类。在公共类中有一个计时器,当触发时,会调用同一个类中的一些代码。从那里,我需要能够在视图控制器中获取和设置控件的属性。

我发现的最接近的示例依赖于视图控制器中调用公共类的代码(因此我们有一个句柄)并允许我更新标签控件文本。然而,这不是我正在寻找的,因为我需要获取并设置多个视图控制器的属性,而不必让视图控制器调用公共类。

我已经尝试了代理人,协议和其他人,但我尝试的所有例子都没有达到这一点。

非常感谢!

[编辑添加最新尝试的例子]
我已经在vcHome.m中实例化了一个常见的类,然后在公共类中调用一个方法

vcHome.h:

@interface vcHome : UIViewCOntroller
{
  // Make this control available to other classes
  UILabel *label1;
}

@property (nonatomic, retain) IBOutlet UILabel *label1;

vcHome.m:

-(void)viewDidLoad
{  
  ...
  //Pass vcHome to clsCommon
  [common saveVCHome:self];
}

然后在clsCommon.h中:

// Declare out shared instance global var storage
+(clsCommon *) sharedInstance; 

// Property to store a pointer to vcHome via global var storage
@property (nonatomic) UIViewController *vcHome;

-(void)saveVCHome:(UIViewController *)vcHome;

和clsCommon.m:

#import <vcHome.h>
...

// The global var storage
+(clsCommon) sharedInstance
{
  static clsCommon *myInstance = nil;
  if(myInstance == nil) {myInstance = [[self class] alloc] init];}
}

-(void)saveVCHome:(vcHome *)vcHomePassed
{
  [clsCommon sharedInstance].vcHome = &vcHomePassed;
}

从那时起,我将指针保存到vcHome视图控制器以供将来使用。

我希望能够引用由标签栏实例化的vcHome视图控制器的原始实例。当一个计时器在clsCommon中激活时(我自己 - 不是从vcHome传递的任何东西)并且能够在vcHome视图控制器中设置/获取控件的属性,如下所示:

clsCommon.m:

-(void)timerFire
{
  [clsCommon sharedInstance].vcHome.label1.text = @"updated from clsCommon";
}

有两个问题。
1.我收到有关间接指针与objective-c指针的错误消息,因此我的语法已关闭。关于我做错的任何想法?
这甚至可能吗?

我尝试了重新实例化vcHome视图控制器的方法,但这将是一个新实例,当然不允许我设置一个控件属性,该属性将显示在最初实例化的视图控制器中,因此,通过尝试保存指向原始的指针。

2 个答案:

答案 0 :(得分:0)

如果您希望您的公共课程能够做出某些事情,那就是#34;向所有视图控制器发出消息,你有几个我可以想到的选择:

1)

您可以创建UIViewController的子类(例如&#34; JohnViewController&#34;),然后将所有后续视图控制器基于此,这意味着它们都可以继承相同的属性(以及设置器和吸气剂)。

2)

您可以让您的视图控制器子类注册,以观察您的公共类在设置和/或获取时发出的NSNotification

答案 1 :(得分:0)

非常感谢迈克尔,建议代表们。这样做,但不是因为这种情况,因为(除非我错了)一个类(我的视图控制器)可以是多个委托,但是一个类(我的公共类)不能被委托给多个视图控制器。

我最终通过NSNotifications实现了这一目标。不是试图使公共类直接获取/设置视图控制器中的控件,公共类在共享实例单例中设置属性(对于要使用的所有视图控制器/类),然后根据需要将通知发送到适当的查看控制器。

请注意,这不仅设置起来非常简单,而且还可以处理多个监听后对。

clsCommon.m:

- (void)processSomething {
  // Some processing changes information that is ultimatley displayed on the Info screen.  Tell the Info screen to update.
    [[NSNotificationCenter defaultCenter]postNotificationName:@"updateInfoScreen" object:nil];
  // Some processing changes information that is ultimatley displayed on the History screen.  Tell the History screen to update.
    [[NSNotificationCenter defaultCenter]postNotificationName:@"updateInfoScreen" object:nil];
}

在视图控制器类中监听这些通知

vcInfo.m:

- (void) viewDidLoad {
 //Listen for notifications
   [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(updateInfo) name:@"updateInfoScreen" object:nil];
}

- (void) dealoc {
  //This method handles stopping the listener when the app is shut down (or this view controller is dismissed)
    [[NSNotificationCenter defaultCenter]removeObserver:self name:@"updateInfoScreen" object:nil];
}

- (void) updateInfo {
  //Put code here that does whatever you want to update this screen
}

vcHistory.m:

- (void) viewDidLoad {
 //Listen for notifications
   [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(updateHistory) name:@"updateHistoryScreen" object:nil];
}

- (void) dealoc {
  //This method handles stopping the listener when the app is shut down (or this view controller is dismissed)
    [[NSNotificationCenter defaultCenter]removeObserver:self name:@"updateHistoryScreen" object:nil];
}

- (void) updateHistory {
  //Put code here that does whatever you want to update this screen
}