Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.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 UIView&;子视图代理_Ios_Objective C_Uiview_Xamarin_Delegates - Fatal编程技术网

Ios UIView&;子视图代理

Ios UIView&;子视图代理,ios,objective-c,uiview,xamarin,delegates,Ios,Objective C,Uiview,Xamarin,Delegates,我只是想澄清我对委托模式的一些困惑,当存在多个UIView和这些视图的子视图时,应该构建委托模式。为了清楚起见,让我们定义一些变量 让我们将这些对象定义为: ViewControllerA ui查看B 子视图C 现在,我理解了委托模式的工作原理(我认为),尽管我不确定如何在嵌套的UIView中实现该模式。我有几个问题: C是否应该包含由其超级视图(B)实现的委托 如果是,是否应该B然后将此信息传递给它的代理ViewController(A) 这里有一个场景,假设C有一个UITextView,

我只是想澄清我对委托模式的一些困惑,当存在多个UIView和这些视图的子视图时,应该构建委托模式。为了清楚起见,让我们定义一些变量

让我们将这些对象定义为:

  • ViewController
    A
  • ui查看
    B
  • 子视图
    C
现在,我理解了委托模式的工作原理(我认为),尽管我不确定如何在嵌套的UIView中实现该模式。我有几个问题:

C
是否应该包含由其超级视图(
B
)实现的委托

如果是,是否应该
B
然后将此信息传递给它的代理ViewController(
A

这里有一个场景,假设
C
有一个UITextView,这个文本视图的高度由从API服务获取的字符串决定
B
无权访问API,因为此作业应通过ViewController(
A
)完成

C
然后包含一个代表,该代表指向:

  • ViewController的(
    A
    )委托实现
  • UIView的(
    B
    )委托实现
  • 其他的
  • 如果答案是(2),那么应该
    B
    然后调用ViewController(
    A
    ),并通过一系列事件传递此信息

    这里有一个小的视觉效果:


    A
    因此,您遇到的情况如下:

    视图控制器A-->视图B-->视图C

    我将尝试确保我的
    视图控制器A
    视图B
    视图C
    做出如下决定:

  • 创建协议
    ViewDelegate
    ,并同时保留
    viewB
    viewC
    委托其中的方法
  • 创建一个属性
    @property(非原子,弱)id委托
    视图B中
  • 创建属性
    @property(非原子,弱)id
    代表
    视图C
  • 在实例化
    视图B时,从
    视图控制器A
    自身设置为代理。像
    viewBObj.delegate=self
  • 在实例化
    视图C
    时,从
    视图B
    自我委托设置为委托。比如
    viewBObj.delegate=self.delegate
  • 这将使
    ViewController A
    同时响应
    View B
    View C
    委托事件

  • 委托是函数指针。使用它,可以很容易地调用另一个类的函数

    要创建委托,常见的过程是,首先创建协议并在其中添加相关方法(在要启动委托方法的类中)。这种方法可以通过采用协议的类来实现

    您还需要创建称为委托属性的协议类型的泛型属性。这将被分配给符合协议的类的实例

    在您的例子中,类B和类C中定义了一些协议。这里,B符合C类协议,A类符合B类协议

    现在,类B中定义了类c的对象。在类B中,这里我们需要将类C的委托分配给B的实例(self)。(现在在c类中,委托属性包含B的实例,可以很容易地从c类调用在B类中实现的协议方法)

    同样的情况也发生在类A和B中,其中可以从类B调用类A的方法(在类B的协议中定义)

    下面是通过A->B->C实现委托链的概述

    A类

    符合协议B

    它有B类对象

    将类A(自身)的实例分配给类B的委托属性

    在类A中,实现类B中定义的协议方法

    B类

    用方法定义协议

    定义用作委托实例的泛型类型的属性

    符合协议C

    它具有类C的对象

    将类B(self)的实例分配给类C的委托属性

    在B类中,实现C类中定义的协议方法

    C类

    用方法定义协议

    定义用作委托实例的泛型类型的属性

    我希望这将有助于您了解委派在iOS中的工作方式

    现在,您可以将类B和类C的协议整合到类A中(如果您不想对类B进行任何修改,只需调用上层的委托方法即可)。

    见下文概述

    A类

    符合协议B

    它有B类对象

    将类A(自身)的实例分配给类B的委托属性

    在类A中,实现类B中定义的协议方法

    符合协议C

    它有C类对象到B类对象

    将类A(自身)的实例分配给类C的委托属性

    在类A中,实现类C中定义的协议方法

    B类

    用方法定义协议

    定义用作委托实例的泛型类型的属性

    C类

    用方法定义协议


    定义充当委托实例的泛型类型属性

    我认为您可以单独创建.h文件并在该类中创建协议。无论您想在何处实现这些协议方法,导入.h类并声明协议并实现该方法。您可以通过创建协议对象从任何地方调用。是的,我理解这一点,但在我的情况下,视图C嵌套在视图B中。按照您将如何拥有包含UITableView的UIView,在这种情况下UIView将实现该委托正确吗?虽然这似乎是控制员的工作。不。还有您的
    ViewController A
    应该是
    UITableVi的
    委托