从UIView委托隐藏UIViewController中的按钮

时间:2014-02-04 17:40:55

标签: ios objective-c uiview uiviewcontroller delegates

我有一个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;

希望所有这些都有意义,提前谢谢!

2 个答案:

答案 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];
}