objective-c – 如何在Objective C中发送superview

前端之家收集整理的这篇文章主要介绍了objective-c – 如何在Objective C中发送superview前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是Objective C和 Cocoa的新手.我只是不知道如何发送UIView的超级视图.我不能得到它的工作这是我到目前为止所尝试的

在我的MainView中,我有一个名为resetDrawType的方法

- (void) resetDrawType {
   self.drawType = foo;
}

另外在MainView中,我创建一个子视图并将其添加到MainView中:

mySubView *mySubView = [[mySubView alloc] initWithFrame:CGRectMake(foo,foo,foo)];
[self addSubview:mySubView];
[mySubView release];

然后当子视图完成它的绘图时,我想发送消息resetDrawType到它的超级视图,这是MainView.

我试过了

[(MainView*)[self superview] resetDrawType];

[(MainView*)self.superview resetDrawType];

…什么没有工作我了解到非正式协议,所以我把这个代码添加到MainView.h

@interface NSObject ( resetters )
    - (void) resetDrawType;
 @end

但依然没有.
接下来我发现这个选择器的东西,并在子视图中尝试过:

if ([self.superview respondsToSelector:@selector(resetDrawType:)])
    [self.superview performSelector:@selector(resetDrawType) withObject:nil];

它也没有工作.我究竟做错了什么?谢谢你的帮助.

解决方法

你不应该有一个子视图告诉它的超级视图什么都没有.你应该使superview成为你的视图类的代表.
// MainView
MyView *myView = [[MyView alloc] initWithFrame:CGRectMake(...) delegate:self];

然后将代理保存到由id委托声明的实例变量中.完成绘图后:

// MyView
- (void)doDrawing {
  drawStuff();
  [delegate didFinishDrawingView:(MyView *)self]
}

现在回到你的MainView,实现这个方法

- (void)didFinishDrawingView:(MyView *)aView;

做你想要的

所有这一切的要点是,您应用程序边缘的小班(如小型子视图)不应该需要知道他们上面的大班上班.此设置允许视图通信链接,但传达自己的状态的消息,而不是指示其他对象执行某些特定操作的消息.这是Cocoa结构化的方式,所以可以轻松地重用类,并且可以重新使用它们的事件,但需要它们.

你的超级视图应该知道它的子视图完成后该怎么做.子视图应该让人们知道它的完成.

在您的子视图类的标题中声明一个实例变量,如下所示:

id delegate;

为您的子视图类编写一个启动器,如下所示:

- (id)initWithFrame:(CGRect)frame delegate:(id)aDelegate {
  [super initWithFrame:frame];
  delegate = aDelegate;
  return self;
}

现在你有一个初始化器可以接受委托,保存该委托,并允许你调用它的方法.

原文链接:https://www.f2er.com/c/111050.html

猜你在找的C&C++相关文章