我是一位经验丰富的开发人员,使用多种语言,但在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视图控制器的方法,但这将是一个新实例,当然不允许我设置一个控件属性,该属性将显示在最初实例化的视图控制器中,因此,通过尝试保存指向原始的指针。
答案 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
}