有没有办法调用“拥有”类的方法? (创建该对象的类)。
情况如下:我的应用程序使用
UIScrollView
。我需要处理触摸事件,因此我没有直接使用 UIScrollView
,而是将其子类化并使用 MyScrollView (这样我就可以实现 touchesEnded:
方法)。在我的视图控制器类中创建了 MyScrollView 的实例。这就是我的问题出现的地方:在 touchesEnded:
方法(在 MyScrollView.m 中)中,我想从 View Controller 类调用一个方法。有没有直接的方法来做到这一点?比如:
[owner myMethod];
我现在所做的方法是将 MyViewController.h 包含在 MyScrollView.m 中并创建它的实例:
MyViewController *controller;
[controller myMethod];
好像不对。有什么见解吗?
经过更多研究,我意识到 UIScrollView 有一个内置的委托协议。这意味着您根本不必将其子类化。
在视图控制器头文件中,找到这一行:
@interface MyViewController : UIViewController {
并将其更改为:
@interface MyViewController : UIViewController <UIScrollViewDelegate> {
假设您正在使用 Interface Builder,打开它并找到您的滚动视图对象。选择它,打开连接检查器,然后将“委托”出口连接到您的视图控制器。返回 Xcode 并打开视图控制器的实现文件。添加方法:
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
NSLog(@"Here is where you do whatever it is that you're trying to do!");
}
应该是这样。如果您需要更多说明,请告诉我。
我的答案的上一个版本:
执行此操作的最佳方法是通过 代表制度。你的滚动视图将 有这样的属性:
@property(nonatomic,assign) id<MyScrollViewDelegate> delegate;
然后你可以定义一个协议 你的代表是这样的:
@protocol MyScrollViewDelegate <NSObject> - (void)methodName; @end
注意:您需要放置一个 对委托的前向引用 在属性线之前,然后定义 之后的方法。一名前锋 它的参考就是
。@protocol MyScrollViewDelegate;
在视图控制器的头文件中, 确保导入的标头 滚动视图,然后更改 对象的父类来自
至UIViewController
。UIViewController <MyScrollViewDelegate>
然后,当您创建滚动视图时 在你的视图控制器中,设置它的 将财产委托给
(你可能 如果是的话,请在 Interface Builder 中执行此操作 这就是你制作 UI 的方式。在那里面 情况下,请务必添加self
在IBOutlet
之前输入关键字id
。)@property
最后,从您的 将视图滚动到视图控制器, 您将运行以下代码:
[self.delegate methodName];
就是这样!
即使你没有提到你正在使用什么编程语言,在 OO 范式中,也没有办法解决对象的creator,除非你对此做点什么。
#解决方案1 如果可以的话,让你的构造函数接受一个 creator 或 parent 参数,该参数由创建类的新实例的对象作为 this 传递。您必须完全控制创建者和被创建者。
#解决方案2 也许并不 100% 适合您的情况,但这就是 factory 模式。一般来说,工厂是一个单例类,因此工厂创建的所有对象都应该具有访问工厂实例的方法。您可以将其与溶液 1 混合。
#解决方案3 反射。根据您的编程语言,当调用构造函数时,您可能会尝试分析堆栈跟踪并尝试获取对调用您的方法的对象的引用。
#解决方案4 采用 Container 模式。如果您可以放弃“创建者”的概念,您可以至少像 WinForms 和 WebForms 那样,将“控件”视为其他控件的“容器”。因此,您拥有从容器对象到所有包含的对象的双重引用和向后引用(在构造函数之后使用特定的 setter 方法/property 设置)。因此,您最终不会引用“创建”您的对象,而是引用“包含”您的对象。同样,您应该完全控制代码。 #如果我是你,我会选择解决方案 1 或 4 [编辑]:当我第一次写答案时,我看不出你正在使用 Objective-C。我不是这方面的专家,我不知道是否有更好的解决方案,但我的(也许除了3)是可行的