从视图子视图类中访问控制器变量或方法

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
   

【讨论】:

以上是关于从视图子视图类中访问控制器变量或方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 中从父视图访问容器视图子视图

从推送视图访问第一个导航控制器中的方法和变量

如何从它的项目 ViewControllers 访问 UITabBarController 的变量

从一个视图控制器访问 CLLocationManager 变量到另一个视图控制器

从不同的视图控制器访问变量

IPHONE 如何从其他类/视图控制器访问变量