1

有没有办法调用“拥有”类的方法?(创建对象的类)。

情况如下:我的应用程序使用UIScrollView. 我需要处理触摸事件,因此UIScrollView我没有直接使用 a ,而是将其子类化并使用 MyScrollView (这样我就可以实现该touchesEnded:方法)。MyScrollView 的一个实例是在我的 View Controller 类中创建的。这是我的问题出现的地方:在touchesEnded:方法中(在 MyScrollView.m 中)我想从 View Controller 类中调用一个方法。有没有直接的方法可以做到这一点?就像是:

[owner myMethod];

我现在正在做的方式是将 MyViewController.h 包含在 MyScrollView.m 中并创建它的一个实例:

MyViewController *controller;
[controller myMethod];

似乎不对。有什么见解吗?

4

2 回答 2

3

经过一番研究,我意识到 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;.

在视图控制器的头文件中,确保导入滚动视图的头文件,然后将对象的父类从 更改 UIViewControllerUIViewController <MyScrollViewDelegate>.

然后,当您在视图控制器中创建滚动视图时,将其委托属性设置为self(如果这是您制作 UI 的方式,您可以在 Interface Builder 中执行此操作。在这种情况下,请确保在输入IBOutlet 之前添加关键字id你的 @property。)

最后,要从滚动视图调用视图控制器,您将运行以下代码:

[self.delegate methodName];

就是这样!

于 2011-01-15T18:40:28.273 回答
1

首先,即使是几个月前的问题,你的 0% 接受率也太糟糕了,你应该尽快解决这个问题,让人们更有可能回答你未来的问题。

即使您没有提及您正在使用哪种编程语言,在 OO 范式中也没有办法解决对象的创建者,除非您对它做点什么。

解决方案 1

如果可以的话,让您的构造函数接受一个创建者参数,该参数由创建您的类的新实例的对象作为this传递。您必须完全控制 creator 和 created。

解决方案 2

也许不是 100% 适合您的情况,但这是工厂模式。一般来说,工厂是一个单例类,所以工厂创建的所有对象都应该有访问工厂实例的方法。您可以将其与溶液 1 混合。

解决方案 3

反射。根据您的编程语言,当您的构造函数被调用时,您可能会尝试分析堆栈跟踪并尝试获取对调用您的方法的对象的引用。

解决方案 4

采用容器模式。如果您可以放弃创建者的概念,至少 WinForms 和 WebForms 是如何做到的,您可以将控件视为其他控件的容器。所以你有一个从容器对象到所有包含的对象的双重引用和一个向后引用(在构造函数之后使用特定的setter 方法/*property* 设置)。因此,您最终不会引用创建您的对象的对象,而是引用包含您的对象的对象。同样,您应该完全控制代码。

如果我是你,我会选择解决方案 1 或 4

[编辑]:当我第一次写答案时,我看不懂你正在使用 Objective-C。我不是这方面的专家,我不知道是否有更好的解决方案,但我的(可能除了 3)是可行的

于 2011-01-15T18:34:52.517 回答