“拥有”类的调用方法?

时间:2011-01-15 18:25:56

标签: objective-c methods owner

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

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

[owner myMethod];

我现在的做法是在MyScrollView.m中包含MyViewController.h并创建它的实例:

MyViewController *controller;
[controller myMethod];

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

2 个答案:

答案 0 :(得分: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;

     

在视图控制器的头文件中,   确保导入的标题   滚动视图,然后更改   来自的父类   UIViewController来   UIViewController <MyScrollViewDelegate>

     

然后,当您创建滚动视图时   在视图控制器中,设置它   将属性委托给self(你可以   如果是这样,请在Interface Builder中执行此操作   是你如何制作你的用户界面。在那里面   大小写,请务必添加IBOutlet   您的id类型前的关键字   @property。)

     

最后,来自你的电话   滚动视图到视图控制器,   你将运行以下代码:

[self.delegate methodName];
     

就是这样!

答案 1 :(得分:1)

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

即使你没有提到你正在使用的编程语言,在OO范例中也没有办法解决对象的创建者,除非你对它做了些什么。

解决方案1 ​​

如果可以,请让构造函数接受由创建新对象的传递的创建者参数你的班级的实例。您必须完全控制创建者并创建。

解决方案2

对于您的情况可能不适合100%,但这是工厂模式。通常,工厂是单例类,因此工厂创建的所有对象都应该具有访问工厂实例的方法。您可以将其与解决方案1混合使用。

解决方案3

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

解决方案4

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

如果我是你

,我会选择解决方案1或4

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