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; } 现在你有一个初始化器可以接受委托,保存该委托,并允许你调用它的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |