[ios]从视图中 ViewController 调用实例方法

标签: ios Objective-C
发布时间: 2017/3/21 23:39:44
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我试图调用实例方法是在我从内 UIView 的 UIViewController。我 UIViewController 我有喜欢的东西︰

-(void) test {
    NSLog(@"test");
}

在我的 UIViewController,我创造我的 UIView 的一个实例就像这样︰

draggableView = [[DraggableView alloc]initWithFrame:CGRectMake(20, 190, 280, 280)];

在我 draggableView ,然后想要来电 test 实例方法。我怎么做这而无需创建一个新的 UIViewController 实例?

我已经试过了,但似乎并不像一个很优雅的解决方案和生成的错误信息"No visible @interface ..."

解决方法 1:

视图没有默认的方法来访问其视图控制器对象。 你需要自己将视图控制器对象传递到视图对象。 典型的方式做到这一点制作一个属性。

@class ViewController;

@interface DraggableView : NSObject
@property (readwrite,nonatomic,assign) ViewController* theOwnerViewController;
@end

@implementation DraggableView
- (void)testCallingOwnerViewControllerMethod
{
    [self.theOwnerViewController test];
}
@end

您需要设置 theOwnerViewController 创建后 DraggableView 对象。

- (void)loadView
{
    draggableView = [[DraggableView alloc]initWithFrame:CGRectMake(20, 190, 280, 280)];
    draggableView.theOwnerViewController = self;
    //...extra view setup.
}

使用 assign 为避免保留循环性能。

委托模式

你可以上面的模式,但你注意到了,你需要知道和转发声明从其视图 (这是 VC 的子节点) 的所有者视图控制器类的名称。通常这是不好的设计选择,因为这样很容易使循环依赖项(或落后的依赖项),其中通常创建紧密耦合。

相反,你可以使用委托模式来避免循环依赖项问题。

@protocol TestDelegate
- (void)test;
@end

@interface DraggableView : NSObject
@property(readwrite,nonatomic,assign) id<TestDelegate> testDelegate;
@end

@implementation DraggableView
- (void)test
{
    [self.testDelegate test];
}
@end

您需要设置 testDelegate 创建后 DraggableView 对象。

@interface ViewController<TestDelegate>
@end
@implementation
- (void)test
{
    // do something.
}
- (void)loadView
{
    draggableView = [[DraggableView alloc]initWithFrame:CGRectMake(20, 190, 280, 280)];
    draggableView.testDelegate = self;
    //...extra view setup.
}
@end

在这种情况下,你不需要知道的视图对象的类名创建之前。任何类符合 TestDelegate 可以使用Protocol,和现在的视图和 VC 是松散耦合的通过议定书 》。

赞助商