2013-01-12 55 views
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] 

据我了解的问题是,在方法调用时刻的“自我”变量是我的非图纸视图控制器,它试图在视图本身,它缺少和崩溃进行明确的方法。

如何将方法发送到正确的视图控制器? 我的想法有缺陷吗?也许这可以通过更好的方式来解决?

编辑: 我已经找到了问题,

[(TouchTrackerView *)self.view clear] 

调用查看,这是UIScrollView的,而且它不支持明确的方法。所以我做了一个包含正确视图的属性,并将其更改为

[(TouchTrackerView *)self.correctView clear] 

它的工作原理类似于魅力。

我选择了通知,因为它只有两行代码,而且我是初学者,而且我很难将头围绕代表,因此我将保留原样,特别是它的工作原理。

+0

一般来说,在你的例子中使用类型转换(“'(TouchTrackerView *)'”)是不可取的。在写得很好的代码中,很少需要强制转换。而且,正如在这种情况下演示的那样,当您使用演员表时,您可能会冒着让编译器认为某个对象属于某种特定类型的风险,而实际上它可能并不实际。如果可以,尽量避免施放。 – Rob

回答

1

在哲学层面上,虽然我同情别人的观察,但您可以用delegate模式(或更好的代表protocol模式)替换通知,但这让我觉得这不是一个合适的示例有两个控制器直接相互通信。您可能应该采用MVC模型,其中编辑视图控制器A设计用于编辑绘图(从而更新模型并协调视图),重置视图控制器B应该更新/重置模型。如果A需要通知模型更改,那么在模型和控制器A之间应用委托协议模式。但我认为B根本不应该与A沟通。

在实际操作中,绝对没有任何理由说明通知不能正常工作。不幸的是,你们没有足够的分享来回答这个问题。您应该分享错误消息的具体内容,我们可能会帮助您更多。

1

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

1

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

一个更好的办法是创造绘画视图控制器的委托协议 -

所以PaintingViewControllerDelegate协议可能有像这样

  • (无效)paintingViewControllerWillClear方法:(PaintingViewController *)paintingViewController ;
  • (void)paintingViewControllerDidClear:(PaintingViewController *)paintingViewController;

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

相关问题