Swift4 Button

开始swift4 之旅。

代码:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let button : UIButton = UIButton.init(frame: CGRect(x:50,y:50,width:80,height:50));
        button.backgroundColor = UIColor.magenta;
        button.setTitle("点击", for: .normal);
        button.setTitle("已点击", for: .selected);
        button.setTitleColor(UIColor.green, for: .normal);
        button.setTitleColor(UIColor.black, for: .selected);
        button.addTarget(self, action:#selector(pressedButtonToDoSomething(_:)), for: .touchUpInside);
        self.view.addSubview(button);
    }
    
    @objc func pressedButtonToDoSomething(_ sender : UIButton) -> Void {
        if sender.isSelected {
            sender.isSelected = false;
        } else {
            sender.isSelected = true;
        }
        print("ssss  \(sender.isSelected)");
    }
}

选择器 Selector

#selector(@objc method)

可以看出,这个生成 Selector 的写法,他的参数一定是带有 @objc 的方法。

方法

无参数的方法:
@objc func method0() -> Void {
    print("--->0");
}

调用:

self.method0();
一个参数的方法:
@objc func method1(viewController : UIViewController) -> Void {
    print("--->1");
}

调用

self.method1(viewController: self);

另一种写法:

@objc func method1(_ viewController : UIViewController) -> Void {
    print("--->1");
}

调用:

self.method1(self);

这两种最大区别是是否隐藏了参数名。

在不隐藏参数名的情况下,不同参数可以相同方法名的:

@objc func method1(viewController : UIViewController) -> Void {
    print("--->1.0");
}
    
@objc func method1(view : UIView) -> Void {
    print("--->1.1");
}

调用:

self.method1(viewController: self);
self.method1(view: self.view);

swift 是支持 隐藏参数名的情况下,不同参数可以相同方法名的:

func method1(viewController : UIViewController) -> Void {
    print("--->1.0");
}
    
func method1(view : UIView) -> Void {
    print("--->1.1");
}

调用:

self.method1(self);
self.method1(self.view);

@objc 的意思是开放给 objective-C 使用,就是说,它提供的东西只能符合 objective-C 的语法。 objective-C 是不支持这么写的,所以注意,以及避免这么写。



/////////////////////分割线/////////////////////

button.addTarget(self, action:#selector(pressedButtonToDoSomething(_:)), for: .touchUpInside);

这种写法外,还可以下面写法:

button.addTarget(self, action:"pressedButtonToDoSomething:", for: .touchUpInside);

不过编辑器已经提示警告,会变成这种写法:

button.addTarget(self, action:#selector(ViewController.pressedButtonToDoSomething(_:)), for: .touchUpInside);

不过仅仅仅限于 @objc 的方法,目前我还没有找到swift的写法。如果用 swift 的方法,会导致运行时出问题,恐怕这个是因为 objective-c 留下给 swift 在 iOS 上不可绕过的坑。这么说,iOS 无法抛弃 objective-c 的开发。。。