【问题标题】:Which is the better way to communicate between two views?在两个视图之间进行交流的更好方式是什么?
【发布时间】:2015-06-03 12:39:29
【问题描述】:

我们的一个项目需要一个简单的自定义键盘控件,该控件将在整个项目的许多视图以及未来可能的项目中重复使用。

提出了一个问题:

如果我们知道键盘控件的唯一目的是为用户提供一种输入数据的方式来修改单个 UITextField 或 UILabel:

a) 最好将对该 UITextField 的引用传递给 CustomKeyboardView 并让该视图处理其类中文本字段文本的修改,或者:

b) 编写一个委托以从 CustomKeyboardView 返回值,并使父 viewController 处理从键盘接收回调并设置 UITextField 的正确值或:

c) 使用其他模式吗?

值得注意的是,将文本写入文本字段的代码比简单地传递原始字符要复杂一些,它比较文本字段中已经存在的值并根据该状态传递字符。

【问题讨论】:

  • 您是否只是想将自定义键盘指定为 UITextField 的 inputView。我将创建一个 UITextField 的子类,它将您的可重复使用的键盘连接为 inputView。然后在情节提要或代码中,您只需将文本字段创建为子类的实例。
  • @RoryMcKinnel 我们可能还需要使用控件来修改UILabels 和UIButtons。选项 a) 使我们能够传递对要使用键盘修改的控件的引用,如果它是一个允许我们设置其文本的控件 - 我们将其设置为文本。如果它不允许文本更改 - 我们会引发异常。
  • 我可以想象一个 UIButton 是必须的场景,但无法想到 UITextField(禁用用户交互,没有边框和清晰的背景颜色)不能替换 UILabel 的任何情况。不要使用标签..而不是使用文本字段..您可以使用自定义视图作为那些键盘..
  • @SwapnilLuktuke 同意,UILabel 可以替换为 UITextField。那么 UIButton 呢,它没有指定我接受的 inputView 呢?还有一个问题,你可以使用 inputView 没有将控件放在屏幕底部的动画吗?该控件是否已经成为 UITextField 也属于的视图的一部分?
  • @Jakub。对于 UILabel,您最好在编辑时将其与 UITextField 交换,然后在完成后将其替换为 UILabel,或者完全使用 UITextField。对于 UIButton,我不确定我是否完全理解用例,除非它是为了实现某种选择器按钮。在这里,我倾向于再次使用与 UIButton 具有相同框架的 UITextField,因此您可以简单地要求它成为 FirstResponder 来编辑标签。如前所述,您只需要求开发人员使用更新后的 UIButton。

标签: ios design-patterns


【解决方案1】:

如果您有两个密切相关的视图,那么您想要的是一个存在于它们之间的控制器。这很可能是拥有键盘的UIViewController,并且您在创建它时会提供UITextFieldUILabel

然后,您的“主”视图控制器可以创建这个自定义视图控制器,就像您使用 UIPopoverControllerUIAlertController 所做的一样。

这种模式使整个包非常可重用,无需将控制器逻辑注入视图。

【讨论】:

  • 选项 a) 的动机是代码膨胀问题,这种问题通常发生在 viewControllers 中。通过将逻辑放置在自定义控件中并绕过 viewController,无需在 VC 中编写额外的代码。尽管 viewController(考虑到它的名字)应该存在于它的子视图之间并管理它的子视图之间的通信,但这确实是有道理的。那么是否应该将当两个子视图想要进行通信时,应该由 VC 处理通信的规则视为规则?
  • 是的,这绝对是规则,但我想说“a VC 应该处理通信。”您不必将所有协调功能放在一个巨大的 VC 中。我建议使用一个较小的子 VC,它只是在键盘和另一个视图之间进行协调。风投只会导致臃肿,因为人们将不相关的协调活动倾倒在一个庞大的控制器中。我建议的子 VC 可以与键盘一起重复使用。
【解决方案2】:

继续我上面的评论,最简单的方法是使用带有自定义视图的文本字段作为输入视图。

您可以轻松地将 UILabels 替换为 UITextFields。

对于 UIButton,将按钮与 UITextField 重叠。当文本字段禁用用户交互时,它将传递对按钮的所有触摸(实现正常的按钮行为),启用后,它将是一个正常的可编辑文本字段,允许您将自定义视图用作“inputView”。

如果您只有一个或两个按钮,您可以对每个按钮执行相同的操作,但如果您有很多按钮,您可以制作一个单独的控件并在整个应用程序中重复使用。

这使您可以 1. 使用健壮的、默认的 iOS 文本字段委托基础设施 2. 如果您愿意,请在编辑时继续使用所有文本字段的好东西,例如占位符文本和清除按钮等。

您可以avoid inputView animation easily。如果没有动画,自定义视图就像是父视图的一部分,如果您让文本字段第一响应者出现在视图中。

【讨论】:

    猜你喜欢
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2019-03-26
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多