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

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

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

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

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

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

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

我试过了

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

@H_404_4@[(MainView*)self.superview resetDrawType];

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

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

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

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

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

解决方法

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

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

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

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

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

做你想要的

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

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

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

@H_404_4@id delegate;

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

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

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

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

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