1

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

调用view是UIScrollView,不支持clear方法。所以我制作了一个包含正确视图的属性,并将其更改为

[(TouchTrackerView *)self.correctView clear]

它就像一个魅力。

我之所以选择通知,是因为它只有两行代码,而且我是初学者,我很难将我的头脑围绕在代表身上,所以我将保持原样,尤其是它可以工作。

4

3 回答 3

1

我认为通知,本质上是一种一对多的通信方法,在这里不适合使用。更好的方法是将一个作为另一个的委托 -> 一旦按下按钮并调用相应的 IBAction,委托(在您的情况下,您用于绘图的视图控制器)应该收到一条消息并执行任何操作这是它需要做的。

于 2013-01-12T16:11:17.993 回答
1

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

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

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

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

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

于 2013-01-12T16:19:03.233 回答
1

在哲学层面上,虽然我很同情其他人的意见,即您可以用委托模式(或者,更好的委托协议模式)替换通知,但令我震惊的是,这不是让两个控制器进行通信的适当示例直接对彼此。您可能应该使用MVC模型,其中编辑视图控制器A设计用于编辑绘图(从而更新模型并协调视图)和重置视图控制器B应该只更新/重置模型。如果A需要通知模型更改,则在模型和控制器之间应用委托协议模式A。但我不认为B应该完全沟通A

在实际层面上,通知完全没有理由不能正常工作。不幸的是,您分享的内容不足以让我们回答这个问题。您应该分享错误消息的细节,我们可能会为您提供更多帮助。

于 2013-01-12T16:56:20.487 回答