问题标签 [target-action]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - 如果在添加的范围之外创建 barBarttonItem,为什么添加它不起作用?
我在添加 barButtons 时遇到了一些问题,并在另一个问题的答案中找到了解决方案,但它没有解释为什么必须在同一范围内创建和添加按钮。我想知道为什么不能在类级别创建按钮并将它们添加到 viewDidLoad 之类的方法中。从下面复制的该问题中不起作用的示例代码:
这会得到一个无法识别@objc 方法的错误(此处不包括)。这些方法没有任何问题,因为当您在 viewDidLoad 中移动按钮创建时,错误消失并且代码有效。
ios - Swift 中的 Target-Action 参数问题
我正在关注 iOS 开发教程并阅读他们的代码。第一个代码:
第二个代码:
据我了解,当用户点击屏幕上的任意位置时,第一个代码使键盘消失。为了实现这一点,采用了 Target-Action 模式。
在第一个代码中#selector(hideKeyboard)
, hideKeyboard 似乎没有任何参数。那么为什么辅助函数中有参数(第二个代码)。
如果参数有效,为什么是gestureRecognizer: UIGestureRecognizer
?
我不太明白参数传递是如何工作的?
swift - Swift UITextField 目标动作作为闭包,不删除目标动作的问题
我对Eric Armstrong的代码做了一些修改
但是这两个代码都有问题。来自 Eric 的那些确实删除了所有目标操作
另一方面,修改后的代码根本不会删除目标操作。当然是 if 条件造成的,但也意味着 Storable 属性中没有正确存储目标。
我的目标是使用闭包精确注册目标操作并删除它们,而不删除通过#selector 添加到给定 UITextField 的所有其他目标操作。现在,我可以在使用这种方法进行闭包式目标操作时删除所有或无目标操作。
更新
根据Eric Armstrong的回答,我已经实现了我的版本。但是我在 Eric 提出的版本中所经历的是,当单元格出现时向 TableView 列表上的 TextField 添加目标操作,然后在单元格消失时从文本字段中删除此目标操作时,之前的代码似乎删除了执行时的所有目标操作removeTarget(for:)
。因此,当在 UITableViewCell 之类的代码中的其他位置时,我在完全不同的目标(UITableViewCell 对象,而不是这个自定义 Target() 对象)上添加了额外的目标操作,而单元格正在消失,然后再次出现在屏幕上并执行 removeTarget(for) 然后这个其他(我称之为目标操作的外部)也被删除并且再也没有调用过。
我认为有些问题是 [String: Target] 字典的使用,它是值类型,它用于 objc_getAssociatedObject 中的属性 getter 的情况
因此,据我了解,给定键没有 objc 对象,而 Storable 为 nil,调用了 nil-coalescing 运算符,静态值类型 Property.property 返回又名 [String : Dictionary]
所以它是由副本返回的,目标对象存储在这个复制的对象中,该对象不是永久存储和在 removeTarget(for:) 中访问的,总是为零。所以 nil 被传递给 UIControl.removetTarget() 并且所有目标动作总是被清除!
我尝试用 NSMutableDictionary 简单地替换 [String: Target] Swift 字典,它是一个引用类型,所以我假设它可以被存储。但是这个简单的静态变量替换并只是通过 nil-coalesing 运算符返回它,因为我假设目标对象只有一个这样的存储,然后在滚动表视图时,每个 removeForTarget() 都以某种方式从所有 UITextFields 中删除了所有目标操作,而不是仅从当前。
我还认为使用 String(describing: type(of: Storable.self)) 是错误的,因为对于给定的 Storable 类型,它总是相同的。
swift - 惰性按钮的目标操作不起作用
使用 Swift 5.1.3、iOS13.3、XCode11.3、
我尝试创建一个简单的按钮目标操作。
但是,Button 位于它自己的 StackView 类中,而且是一个惰性按钮。
为什么目标操作在我的代码中不起作用?即callButtonMethod
永远不会被调用!
可能是因为 API 响应较晚,还是因为惰性按钮无法执行目标操作。我现在一无所知。
感谢您对此的任何帮助。
这是我的代码:
CockpitHeaderStackView
用于创建我的 ViewController 的自定义 NavigationBar 。
这里是自定义 NavigationBar 的代码,其中使用了CockpitHeaderStackView
:
uikit - 如何为自定义 UIControl 设置 primaryActionTriggered?
我创建了一个自定义 UIControl。最接近的比较是 UIStepper 但它是 UIControl 的子类,因为它完全是自定义的。
对于大多数 UIControls,您可以创建目标操作primaryActionTriggered
以避免需要知道哪些操作很重要。我想为我的自定义 UIControl 提供同样的便利。那么我该如何映射UIControl.Event.valueChanged
到UIControl.Event.primaryActionTriggered
?
swift - 如何在代码中为自定义 NSControl 定义操作?
我已经创建了一个子类,NSControl
它是格式化数字NSTextField
和NSStepper
. 这是基本代码:
如果我创建一个实例并将其作为子视图添加到我的主视图中,这将按预期工作:我可以单击步进按钮来更改值,我可以直接输入一个数字。
但是,我不知道如何定义将通知我的目标(超级视图)任何更改的操作。
我创建了一个这样的实例:
并定义这样的方法:
但是该方法永远不会被调用,因为 StepperWithNumberField 不知道何时将任何操作发送到目标。
我希望每当 intValue 发生变化时,通过使用步进按钮或直接用户输入将操作发送到目标。
我在哪里——如果可能的话——告诉班级发送动作的条件?我已经搜索了 Apple 的文档以及这个社区,但是关于该主题的大多数问题和示例代码都已有 10 多年的历史,并且无法快速处理。
在这个线程...
...建议使用委托,这当然是一种解决方案,但我仍然对如何在自定义 NSControl 中实现目标动作模式感兴趣。