从另一个视图控制器清除视图

时间:2013-01-12 15:49:41

标签: ios objective-c ios6

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

它就像一个魅力。

我选择了通知,因为它只有两行代码,而且我是初学者,我很难绕过代表,所以我会保留原样,特别是它可以工作。

3 个答案:

答案 0 :(得分:1)

我认为通知本质上是一对多的通信方式,在这里使用效果不佳。更好的方法是将一个挂钩作为另一个的代表 - >一旦按下按钮并调用相应的IBAction,代表(在您的情况下,您用于绘图的视图控制器)应该获得一条消息并执行它需要做的任何事情。

答案 1 :(得分:1)

除非您尝试广播多个对象可能感兴趣的信息,否则我会避免通知。

更好的方法可能是为绘制视图控制器创建委托协议 -

所以PaintingViewControllerDelegate协议可能有这样的方法

  • (void)paintingViewControllerWillClear :( PaintingViewController *)paintingViewController;
  • (void)paintingViewControllerDidClear :( PaintingViewController *)paintingViewController;

现在带有按钮的控制器成为PaintingViewController的委托,该对象根据需要提供PaintingViewControllerDelegate协议的方法。

答案 2 :(得分:1)

在哲学层面,虽然我同意其他人的意见,你可以用delegate模式(或者更好,委托protocol模式)替换通知,但这让我感到震惊这不是让两个控制器完全直接相互通信的合适例子。您可能应该使用MVC模型,其中编辑视图控制器A用于编辑图形(从而更新模型并协调视图)和重置视图控制器, B,应该只更新/重置模型。如果需要通知A模型更改,则在模型和控制器A之间应用委托协议模式。但我认为B根本不应与A进行沟通。

在实际水平上,绝对没有理由说通知不能正常工作。不幸的是,你没有足够的分享我们回答这个问题。您应该分享错误消息的细节,我们可以为您提供更多帮助。