这绝对不是禁用按钮的重复项。我经历了几次都没有成功。实际上,我根本不记得在那里看到sender.enabled
。我在Apple开发者论坛中找到了该代码。
您可以通过sender参数引用一个IBAction
按钮,并从代码中的其他位置更改其状态吗?在IBAction
闭包中更改按钮的状态看起来像:sender.enabled = false
或sender.enabled = true
但我正在尝试从另一个函数中更改其状态。
我知道可以从其他功能中更改IBOutlet
按钮的状态,如下所示:
@IBOutlet weak var myButton: UIButton!
// then elsewhere in your code, within a method implementation:
myButton.enabled = false
但是使用IBAction
按钮可能会发生这种情况。
答案 0 :(得分:1)
是的。那是可能的。您可以将UIButton对象发送给其他函数以实现此目的。
function makeLib<T extends Array<{action : V, from: V, get: V, fn: (...a: any[])=> any}>, V extends string>(...a:T){
return a;
}
const libs = makeLib({
action: "add",
from: "numbers",
get: "number",
fn: (...n: number[]): number => n.reduce((a, b) => a + b, 0),
}, {
action: "subtract",
from: "numbers",
get: "number",
fn: (...n: number[]): number | null => n.reduce((a, b) => a - b, 0),
}, {
action: "readFile",
from: "string",
get: "string",
fn: async (s:string): Promise<string> => promisify(fs.readFile)(s, 'UTF8'),
}, {
action: "readFile",
from: "string",
get: "buffer",
fn: async (s:string): Promise<Buffer> => promisify(fs.readFile)(s),
})
const library = <T extends Array<{action : string, from: string, get: string, fn: (...a: any[])=> any}>,
A extends T[number]['action'], F extends T[number]['from'], G extends T[number]['get']>(a: A, from: F, get: G, lib: T) => {
const found = lodash.find(lib, fn => {
return (
lodash.isEqual(fn.from, from) &&
lodash.isEqual(fn.get, get)
);
});
if (!found) throw new Error('no conversion');
return found.fn as Extract<T[number], {action : A, from: F, get: G }>['fn'];
}
const { readFile } = Actions;
const { string: s } = Types;
const x = library("readFile", "string", "string", libs) // x is (s: string) => Promise<string
x('./tres.ts').then(console.log)
const x2 = library("subtract", "string", "string", libs) // never
const x3 = library("subtract", "numbers", "number", libs) // (...n: number[]) => number
我希望这会有所帮助。
答案 1 :(得分:1)
是的,您可以根据需要更改status
属性。
@IBOutlet var BtnOne:UIButton! @IBOutlet var BtnTwo:UIButton! @IBAction func btnOnePressed (_ sender: Any) { print("BtnOne is disabled") BtnOne.isEnabled = false // or true //you can call any func btnTwoPressed() } @IBAction func btnTwoPressed (_ sender: Any) { print("BtnOne is enabled") BtnOne.isEnabled = true }
答案 2 :(得分:1)
您对@IBAction
的含义有些困惑。
这是将情节提要中的动作(通常为.touchUpInside
的{{1}}与代码中的函数连接的一种方式)。 UIButton
参数成为被点击的按钮。
此代码,例如:
sender
可以将分配为控制器中许多不同按钮的@IBAction func buttonTapped(_ sender: UIButton) {
// code here
}
操作。考虑一组标记为1到10的按钮。将每个按钮连接到该.touchUpInside
,然后:
@IBAction
如果您引用了按钮对象,则可以使用@IBAction func buttonTapped(_ sender: UIButton) {
print("You tapped the button labeled: \(sender.currentTitle)")
}
方法来 获得分配给它的操作(通过代码或故事板@IBAction
进行分配),但这很复杂,可能不合适。
不过,作为示例,...假设您的视图中有一个按钮连接到上面显示的actions(forTarget:forControlEvent:)
,则可以执行以下操作:
@IBAction
尽管,您可以更轻松地将按钮连接到override func viewDidLoad() {
super.viewDidLoad()
for v in view.subviews {
if let b = v as? UIButton,
let a = b.actions(forTarget: self, forControlEvent: .touchUpInside) {
if a.contains("buttonTapped:") {
print("Found button with buttonTapped: IBAction \(b)")
}
}
}
}
(或@IBOutlet
)。如果您的代码确实试图查找连接到{ {1}},您可能想重新评估代码设计。