我有一个viewController,其中我有一个视图,我通过点击在Paint中绘制。在那个控制器中我有一个清除屏幕的方法 -
- (void) clearS
{
[(TouchTrackerView *)self.view clear];
}
现在,因为我不想用按钮占据我的屏幕,我在另一个屏幕上有按钮,将应用程序重置到起始位置,我希望它清除屏幕。该按钮属于不同的视图控制器,除此之外,我希望它调用我的绘图视图控制器并要求它清除屏幕。所以我在绘图视图控件中设置了通知:
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(clearS) name:@"clearScreen" object: nil];
在我的视图控制器中这样点击按钮:
[[NSNotificationCenter defaultCenter] postNotificationName:@"clearScreen" object: nil];
据我了解,当点击按钮时,会发布通知,并调用方法。它崩溃了。
[(TouchTrackerView *)self.view clear]
据我所知,问题是在方法调用的那一刻,“self”变量是我的非绘图视图控制器,它试图在自身的视图上执行清晰的方法,它缺少并崩溃。
如何将方法发送到正确的视图控制器? 我的想法有缺陷吗?也许这可以用更好的方式来解决?
修改 我发现了问题,
[(TouchTrackerView *)self.view clear]
调用视图,它是UIScrollView,它不支持clear方法。所以我创建了一个包含正确视图的属性,并将其更改为
[(TouchTrackerView *)self.correctView clear]
它就像一个魅力。
我选择了通知,因为它只有两行代码,而且我是初学者,我很难绕过代表,所以我会保留原样,特别是它可以工作。
答案 0 :(得分:1)
我认为通知本质上是一对多的通信方式,在这里使用效果不佳。更好的方法是将一个挂钩作为另一个的代表 - >一旦按下按钮并调用相应的IBAction,代表(在您的情况下,您用于绘图的视图控制器)应该获得一条消息并执行它需要做的任何事情。
答案 1 :(得分:1)
除非您尝试广播多个对象可能感兴趣的信息,否则我会避免通知。
更好的方法可能是为绘制视图控制器创建委托协议 -
所以PaintingViewControllerDelegate协议可能有这样的方法
现在带有按钮的控制器成为PaintingViewController的委托,该对象根据需要提供PaintingViewControllerDelegate协议的方法。
答案 2 :(得分:1)