加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:34:24 所属栏目:百科 来源:网络整理
导读:我是Objective C和 Cocoa的新手.我只是不知道如何发送UIView的超级视图.我不能得到它的工作这是我到目前为止所尝试的 在我的MainView中,我有一个名为resetDrawType的方法: - (void) resetDrawType { self.drawType = foo;} 另外在MainView中,我创建一个子视
我是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;
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读