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 的开发。。。