从自定义视图将数据传递给ViewController

时间:2013-06-19 21:18:25

标签: ios uiview uiviewcontroller delegates

我在XCode上的单一视图应用程序的自定义视图大约是整个iPhone屏幕的一半大小。我已经实现了一个只能在自定义视图中使用的绘图工具。自定义视图记录绘图工具移动的距离。只有一个ViewController,我想在自定义fiew框架之外的Label中显示距离变量。我是否需要使用协议和代理来执行此操作?还是有一个更简单的方法?过去几天我一直在使用协议和委托方法进行测试,并且没有任何进展。

2 个答案:

答案 0 :(得分:1)

首先在界面构建器中添加自定义视图作为主视图控制器视图的子视图,同时添加标签。然后将标签和视图的出口添加到视图控制器(让我们分别称它们为distanceLabel和drawView)。

现在将distanceDrawn声明为自定义视图的属性,并在移动工具时更新它以包含正确的数字。

然后在视图控制器viewDidLoad中添加:

    [drawView addObersver:self forKeyPath:@"distanceDrawn" options:NSKeyValueObservingOptionNew context:null]

还要添加到控制器:

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
        if ([object isEqual:drawView]) {
            id distance = change[NSKeyValueChangeNewKey]; //change to appropriate type
            distanceLabel.text = [NSString stringWithFormat:@"%@", distance];
        }
    }

现在,无论何时更改distanceDrawn,都会调用此方法,名为change的字典将包含键NSKeyValueChangeNewKey的新设置值。如果您检索该值,则可以更新标签。

答案 1 :(得分:0)

您的自定义视图应具有绘图长度的属性。然后,您可以从任何引用自定义视图的类中读取值。

每次绘图长度增加时,您可能还希望视图控制器更新标签。您可以使用键值观察来处理它。当其drawingLength属性更改时,您可以从自定义视图对象注册通知。

您可以使用代理人执行此操作。在某些情况下,我认为这是一个更清洁的解决方案。很高兴能够清楚地了解您可以从自定义视图中收听哪些更新。但是,这种情况正是Key-Value Observing的用途。