草庐IT

引用属性上的快速属性观察器

coder 2023-09-15 原文

如何获取引用属性来触发属性观察器?

为了演示我的问题,我编写了一个带有一个按钮和一个标签的简单 MVC 程序。该按钮会增加模型中的计数器,并在 View Controller 的标签中显示计数器的值。

问题是计数器增量(在模型中)不会触发 didSet 观察者(在 View Controller 中)

这是模型文件:

import Foundation

class MvcModel {
    var counter: Int
    var message: String

    init(counter: Int, message: String) {
        self.counter = counter
        self.message = message
    }
}

// create instance
var model = MvcModel(counter: 0, message: "" )

// counting
func incrementCounter() {
    model.counter += 1
    model.message = "Counter Value:  \(model.counter)"
    //print(model.message)
}

这是 View Controller 文件:

import Cocoa

class ViewController: NSViewController {

    let model1 = model

    var messageFromModel = model.message {
        didSet {
            updateDisplayCounterLabel()
        }
    }

    // update Label
    func updateDisplayCounterLabel() {
        DisplayCounterLabel.stringValue = model1.message
    }

    // Label
    @IBOutlet weak var DisplayCounterLabel: NSTextField! {
        didSet {
            DisplayCounterLabel.stringValue = "counter not started"
        }
    }

    // Button
    @IBAction func IncrementButton(_ sender: NSButton) {
        incrementCounter()
        print("IBAction:  \(model1.message)")
    }
}

我猜这个问题与引用属性有关(因为我已经能够使这个程序与基于结构的模型一起工作)。

如果有人能告诉我如何处理属性观察器和引用属性并使这种 MVC 正常工作,我将不胜感激,因为我打算在实际程序中使用它。

最佳答案

您可以为 MvcModel 创建一个委托(delegate)

protocol MvcModelDelegate {
    func didUpdateModel(counter:Int)
}

接下来您将委托(delegate)属性添加到 MvcModel

class MvcModel {
    var counter: Int {
        didSet {
            delegate?.didUpdateModel(counter: counter)
        }
    }

    var message: String
    var delegate: MvcModelDelegate?

    init(counter: Int, message: String) {
        self.counter = counter
        self.message = message
    }
}

然后你让 ViewController 类符合 MvcModelDelegate 最后你设置 model.delegate = selfviewDidLoad

class Controller: UIViewController, MvcModelDelegate {

    let model = MvcModel(counter: 0, message: "hello")

    override func viewDidLoad() {
        super.viewDidLoad()
        self.model.delegate = self
    }

    func didUpdateModel(counter: Int) {
        print("new value for counter \(counter)")
    }

}

关于引用属性上的快速属性观察器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44684607/

有关引用属性上的快速属性观察器的更多相关文章

  1. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

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

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

  3. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  4. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  5. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  6. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  7. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  8. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  9. ruby - 一个 YAML 对象可以引用另一个吗? - 2

    我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的ruby​​yaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir

  10. ruby - Chef Ruby 遍历 .erb 模板文件中的属性 - 2

    所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有特定键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:属性:#===DefaultfileConfigurations#default['elasticsearch']['default']['ES_USER']=''default['elasticsearch']['default']['ES_GROUP']=''default['elasticsearch']['default']['ES_HEAP_SIZE']=''default['elasticsearch']['default']['MAX_OP

随机推荐