我是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但依然没有.
接下来我发现这个选择器的东西,并在子视图中尝试过:
它也没有工作.我究竟做错了什么?谢谢你的帮助.
解决方法
你不应该有一个子视图告诉它的超级视图什么都没有.你应该使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; }