您可以在其关闭之外更改IBAction按钮的状态吗? -迅捷4

时间:2019-02-05 06:58:17

标签: uibutton swift4 ibaction iboutlet

这绝对不是禁用按钮的重复项。我经历了几次都没有成功。实际上,我根本不记得在那里看到sender.enabled。我在Apple开发者论坛中找到了该代码。

您可以通过sender参数引用一个IBAction按钮,并从代码中的其他位置更改其状态吗?在IBAction闭包中更改按钮的状态看起来像:sender.enabled = falsesender.enabled = true但我正在尝试从另一个函数中更改其状态。

我知道可以从其他功能中更改IBOutlet按钮的状态,如下所示:

@IBOutlet weak var myButton: UIButton!  
// then elsewhere in your code, within a method implementation:  
myButton.enabled = false   

但是使用IBAction按钮可能会发生这种情况。

3 个答案:

答案 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}},您可能想重新评估代码设计。