我有一个UIView类作为子视图加载到UIViewController中,捕获触摸并将它们绘制到屏幕上(一个简单的绘图应用程序)。我想在绘图开始时隐藏UIViewController中的一些按钮。在UIViewController(DrawingController.m)中viewDidLoad方法:
//init the draw screen
drawScreen=[[MyLineDrawingView alloc]initWithFrame:self.view.bounds];
[drawScreen setBackgroundColor:[UIColor clearColor]];
[self.view addSubview:drawScreen];
我在UIViewController(DrawingController.m)中有一个方法,它隐藏了UIViewController中存在的颜色选择器,画笔大小按钮等。从同一个类(DrawingController.m)调用时,hide方法可以正常工作。基本上当 - (void)touchesBegan:(NSSet *)触及withEvent :( UIEvent *)事件方法在UIView类(MyLineDrawingView.m)中调用时我希望隐藏按钮:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
DrawingController *drawController = [[DrawingController alloc] init];
[drawController hideDrawIcons];
}
我已经在UIViewController中的hideDrawIcons方法中添加了一些日志记录并且它被调用了,但是我的所有隐藏代码都没有工作:
self.undoBtn.hidden = YES;
我怀疑这是因为我正在使用DrawingController制作一个新的UIViewController类实例* drawController = [[DrawingController alloc] init]; - 但我不确定如何以不同的方式做事?
我当然在DrawingController.h头文件中公开了正确的方法,以便能够从UIView类(MyLineDrawingView.m)调用它:
-(void)hideDrawIcons;
希望所有这些都有意义,提前谢谢!
答案 0 :(得分:1)
你是对的。您不需要创建DrawingController的新实例。 您只需要在View类中拥有DrawingController的指针即可。如果您想了解有关此技术的更多信息,可以阅读有关委托模式的信息。如果没有,这是简单的步骤。
在MyLineDrawingView.h文件中添加协议(或者您可以为其创建单独的文件)
@protocol MyLineDrawingProtocol <NSObject>
-(void)hideDrawIcons;
@end
在DrawingController.h中
@interface DrawingController <MyLineDrawingProtocol>
{
// members ....
}
@end
在MyLineDrawingView.h中
@interface MyLineDrawingView
{
// members ....
}
@property (nonatomic,weak) id <MyLineDrawingProtocol> delegate;
@end
为您的观点设置委托
//init the draw screen
drawScreen=[[MyLineDrawingView alloc]initWithFrame:self.view.bounds];
drawScreen.delegate = self;// self is a pointer of DrawingController
[drawScreen setBackgroundColor:[UIColor clearColor]];
[self.view addSubview:drawScreen];
最后一次改变。为delegate(DrawingController)调用hideDrawIcons方法
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
if ( [self.delegate respondsToSelector:@selector(hideDrawIcons)] )
[self.delegate hideDrawIcons];
}
答案 1 :(得分:0)
是的,您正在视图中创建视图控制器的新副本,这是错误的。你想要的是有一个实际的视图控制器的引用。这是你如何做到的:
在MyLineDrawingView中,声明一个属性:
@property (nonatomic, weak) DrawingController *drawingController;
请注意,它被声明为弱,这会阻止retain cycle。
实例化视图时:
drawScreen=[[MyLineDrawingView alloc]initWithFrame:self.view.bounds];
drawScreen.drawingController = self; // pass the actual view controller instance to the drawScreen object.
最后,在MyLineDrawingView中:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.drawingController hideDrawIcons];
}