草庐IT

ios - MVC 模型 - Controller 应该直接访问 View 的控件吗?

coder 2023-09-27 原文

我正在学习 iOS 开发,我在教程和书籍中发现 Controller 层通常可以直接访问 View 的控件(文本字段、标签等)。让我们考虑这样一个例子:

假设,该 View 有一个名为 lblResult 的标签和一个名为 txtDataToAnalyze 的文本字段。比起在 Controller 界面中,我们有这样的东西:

@property (nonatomic, retain) IBOutlet UILabel* lblResult;
@property (nonatomic, retain) IBOutlet UITextField* txtDataToAnalyze;

以及实现文件中的一些@synthesize语句。

我有一些 JavaSwing 开发经验,其中大多数人认为我是在没有任何 GUI 构建器的情况下手动编写的,而我通常在 MVC 中所做的是通过 getter/setter 访问 View 的控件。例如:void setResult(String resString);String getDataToAnalyze();。这样, Controller 只知道 View 中显示了什么信息,而不知道它们是如何显示的。我认为它更灵活(以后更改 View 层更容易)。

我知道 iOS 有一些特定的规则,引入了 XIB/NIB 文件等,所以对于 iPhone/iPad 开发,我的疑虑可能完全没用。但我打算为 iOS 编写一些更严肃的应用程序(实际上是从 Java Swing 中“重写”它),这就是为什么我想问你:

你认为,我应该改变我的思维方式并习惯这种新的(对我而言)方法(xib 文件、使用拖放创建 GUI 和向 Controller 提供有关数据应如何在 View 中显示的信息) ??刚入手iOS的你有没有类似的疑惑?

最佳答案

简答:

是的,我认为您绝对应该花一点时间习惯使用 Interface Builder (IB) 制作 NIB 和 Storyboard,并让 IB 创建 IBOutletIBAction 为您提供需要交互的那些控件的引用。一旦您精通它,您将对您生成易于维护的代码的效率印象深刻。不要太快解雇 IB。

就让 Controller 直接与 IBOutletIBAction 引用交互而言,这是简单用户界面的常见做法。如果您有一些真实世界的示例,请发布带有屏幕快照的新问题,我们可以提供更多实用指导。

长答案:

  1. 您的问题的部分原因似乎是看到 View Controller 与 View 控件进行详细交互时的忧虑。问题是,如果你想将你的 Controller 与 View 的一些实现细节隔离开来,那么继续对 View 进行子类化并将 View 特定的东西放在那里。 IB 可以与 View Controller 子类以及 View 子类进行交互。因此,您可以愉快地使用 IB,并且仍然将您的 View Controller 与其中一些实现细节隔离开来。

    就个人而言,我只在 View 达到某个主观复杂性阈值时才对 UIView 进行子类化(例如,对我来说,该阈值是当我发现自己在做一些复杂的动画时,例如使用 CADisplayLink;复杂的手势识别器等)。我还将那些作为它们自己的逻辑实体的 subview 子类化(例如 UITableViewCellUICollectionViewCell)。但是对于我与我的模型交互以设置控件的属性、与文本字段交互等的简单 View ,我认为将它放在 View Controller 中就可以了。话虽如此,如果我的 Controller 中有很多特定于 View 的代码,而这些代码与我的模型与我的 View 的集成无关,那么就开始子类化 UIView 并移动仅 View 将代码写入其中。

  2. 您的问题中隐含了以编程方式构建 View 而不是使用 NIB/ Storyboard的概念。在我看来,使用 Interface Builder (IB) 构建 UI 更易于开发和维护。做一个以编程方式构建 View 的测试项目可能有一些教学值(value),因此您真正了解发生了什么,但在那之后,我认为您会发现自己很快就会被 Storyboard 所吸引。当您开始做超出标准 IB 控件功能的事情(例如复杂的自定义容器 View 等)时,您将有很多机会编写自己的非 IB 代码。肯定有人更喜欢以编程方式开发 View ,但我认为您无法超越 IB 生成的 UI 的开发速度和易维护性。

关于ios - MVC 模型 - Controller 应该直接访问 View 的控件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15451589/

有关ios - MVC 模型 - Controller 应该直接访问 View 的控件吗?的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  3. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  4. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  5. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  6. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  7. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  8. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  9. ruby-on-rails - rails : How to make a form post to another controller action - 2

    我知道您通常应该在Rails中使用新建/创建和编辑/更新之间的链接,但我有一个情况需要其他东西。无论如何我可以实现同样的连接吗?我有一个模型表单,我希望它发布数据(类似于新View如何发布到创建操作)。这是我的表格prohibitedthisjobfrombeingsaved: 最佳答案 使用:url选项。=form_for@job,:url=>company_path,:html=>{:method=>:post/:put} 关于ruby-on-rails-rails:Howtomak

  10. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

随机推荐