从视图子视图类中访问控制器变量或方法
Posted
技术标签:
【中文标题】从视图子视图类中访问控制器变量或方法【英文标题】:access a controllers variable or method from within the views subview class 【发布时间】:2011-02-10 20:01:00 【问题描述】:晚上好, 这是问题,[self.view addSubview:pauseView]; 在将 pauseView 加载到当前视图之前,将 BOOL isPaused 设置为 false,然后出现子视图。我正在尝试将变量的值从使用 pauseview 更改为 false,但由于它不在当前类中,因此我无法执行此操作。 我知道这个主题已经包含在 *** 中,但我仍然无法解决我的问题。如果我能够解决这个问题,它将在我的其他 3 个应用程序中解决相同类型的问题。
真诚地, Sonic555gr
【问题讨论】:
【参考方案1】:将isPaused定义为定义isPaused的类中的一个属性(我们称之为MasterView):
// inside MasterView.h
@property (nonatomic,assign) BOOL isPaused;
然后让您的子视图 pauseView 成为自定义 UIView 子类(我们称之为 PauseView),并在此子类中定义一个名为 MasterView 类型的主属性:
// inside PauseView.h
@property (nonatomic,assign) MasterView *master
然后,当您分配/初始化您的 pauseView 时,只需设置此属性:
// somewhere inside MasterView.m
PauseView *pauseView = [[PauseView alloc] initWithFrame:frame];
pauseView.master=self;
最后在您的 PauseView 类中,在您要更改 isPaused 属性的代码点中,执行以下操作:
// somewhere in PauseView.m
master.isPaused=YES
【讨论】:
我现在看到,如果我将对我的主控制器实例的引用传递给它的子视图之一,那么我可以操纵任何变量!你让我头脑清醒,为此我感谢你! :D 好的,太好了;但不要坚持这种模式,尽量保持视图和控制器分开,并记住控制器必须控制视图,反之亦然;所以我希望这在你的代码中是一个例外,而不是规则。【参考方案2】:您确实应该考虑一下您的架构,并尝试将您的应用程序逻辑从 UIViews 移回控制器(即委托可能是一个不错的选择,但如果不查看更多代码和您是什么就不可能知道努力实现)。
如果您坚持从 UIView 操作变量,则需要在初始化时将 viewController 的引用传递给 pauseView。
因此,在您的 PauseView 类中,您将创建一个自定义初始化程序:
-(id)initWithFrame:(CGRect)frame andViewController:(id)vc
self = [super initWithFrame:frame];
if (self)
// Any other custom initialisation here
【讨论】:
以上是关于从视图子视图类中访问控制器变量或方法的主要内容,如果未能解决你的问题,请参考以下文章
如何从它的项目 ViewControllers 访问 UITabBarController 的变量