Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从自定义视图向ViewController传递数据_Ios_Uiview_Uiviewcontroller_Delegates - Fatal编程技术网

Ios 从自定义视图向ViewController传递数据

Ios 从自定义视图向ViewController传递数据,ios,uiview,uiviewcontroller,delegates,Ios,Uiview,Uiviewcontroller,Delegates,我在XCode上的单视图应用程序有一个自定义视图,大约是整个iPhone屏幕的一半大小。我已经实现了一个绘图工具,它只能在自定义视图中使用。自定义视图记录绘图工具移动的距离。由于只有一个ViewController,我希望在自定义fiew帧之外的标签中显示距离变量。我是否需要使用协议和代理来执行此操作?还是有更简单的方法?在过去的几天里,我一直在使用protocols and delegates方法进行测试,但没有取得任何进展。您的自定义视图应该具有图形长度属性。然后,可以从任何引用自定义视图的

我在XCode上的单视图应用程序有一个自定义视图,大约是整个iPhone屏幕的一半大小。我已经实现了一个绘图工具,它只能在自定义视图中使用。自定义视图记录绘图工具移动的距离。由于只有一个ViewController,我希望在自定义fiew帧之外的标签中显示距离变量。我是否需要使用协议和代理来执行此操作?还是有更简单的方法?在过去的几天里,我一直在使用protocols and delegates方法进行测试,但没有取得任何进展。

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

您可能还希望视图控制器在每次图形长度增加时更新标签。你可以通过观察键值来处理这个问题。当自定义视图对象的drawingLength属性更改时,可以从该对象注册通知


您可以通过一个代理来完成此操作。在某些情况下,我认为这是一个更干净的解决方案。弄清楚您可以从自定义视图中监听哪些类型的更新很好。但是,这种情况正是观察键值的目的。

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

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

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

    [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];
        }
    }

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

所有这些都是有效的解决方案,但我建议设置代理协议以通知视图控制器更新。虽然键值观察肯定会起作用,但它通常用于控制器不是被修改对象的实际所有者的情况。这是委托协议的一种标准用法。检索值是什么意思?除了你的最后一句话之外,到那时为止的一切对我来说都是有意义的。谢谢@食人族对不起,我真的没看到你回应。我的意思是,您可以在
-observeValueForKeyPath:ofObject:change:context:
中调用
[change objectForKey:NSKeyValueChangeNewKey]
,并使用返回值更新标签,就像上面的代码一样。希望不会太晚。