Swift/Xcode新手求助:创建带Action的样式化按钮及layer属性报错解决
帮你解决Swift & Xcode的两个新手问题
嘿,作为刚接触Swift和Xcode的新手,遇到这俩问题真的太常见啦,我来帮你逐个搞定~
问题1:创建带Action的按钮并保留样式属性
不管是用Storyboard可视化创建,还是纯代码写按钮,都能同时实现「点击触发Action」和「自定义样式」,分两种情况给你说明:
用Storyboard的方式
- 从右侧组件库拖一个
UIButton到你的ViewController界面上 - 先设置样式:可以在Attributes Inspector里修改背景色、文字颜色,也可以选中按钮后,通过后续添加的IBOutlet在代码里设置layer相关属性(比如边框、圆角)
- 添加Action:按住Ctrl键,从按钮拖拽到ViewController的代码区域,在弹出窗口里选择Action,命名比如
butLogin,Sender类型选UIButton(比AnyObject更精准),点击Connect就完成了。这样按钮既有你设置的样式,点击又能触发对应的方法。
纯代码创建的方式
如果不想用Storyboard,直接写代码的示例如下:
override func viewDidLoad() { super.viewDidLoad() // 创建按钮 let loginButton = UIButton(type: .system) loginButton.setTitle("登录", for: .normal) // 设置样式 loginButton.backgroundColor = .blue loginButton.setTitleColor(.white, for: .normal) loginButton.layer.borderWidth = 1 loginButton.layer.borderColor = UIColor.white.cgColor loginButton.layer.cornerRadius = 8 // 设置AutoLayout布局 loginButton.translatesAutoresizingMaskIntoConstraints = false view.addSubview(loginButton) NSLayoutConstraint.activate([ loginButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), loginButton.centerYAnchor.constraint(equalTo: view.centerYAnchor), loginButton.widthAnchor.constraint(equalToConstant: 120), loginButton.heightAnchor.constraint(equalToConstant: 40) ]) // 添加点击Action loginButton.addTarget(self, action: #selector(butLogin(_:)), for: .touchUpInside) } // 对应的点击处理方法 @objc func butLogin(_ sender: UIButton) { print("登录按钮被点击啦") // 这里写你的登录逻辑 }
问题2:报错「Value of type '(AnyObject) -> ()' has no member 'layer'」
看你的代码,问题出在把IBAction方法和按钮实例搞混了!
你写的@IBAction func butLogin(_ sender: AnyObject) { }是处理按钮点击的方法,不是按钮本身。如果要设置按钮的layer属性,得先给按钮加一个IBOutlet引用,步骤如下:
- 在Storyboard里选中登录按钮,按住Ctrl拖拽到ViewController代码区域,这次在弹出窗口里选择Outlet,命名比如
butLoginButton,类型选UIButton,点击Connect - 现在你有了按钮的实例引用,就能在
viewDidLoad里正常设置layer属性了:
// 先声明按钮的IBOutlet引用 @IBOutlet weak var butLoginButton: UIButton! @IBOutlet weak var butSignupButton: UIButton! // 按钮的点击处理方法 @IBAction func butLogin(_ sender: UIButton) { // 点击逻辑 } @IBAction func butSignup(_ sender: UIButton) { // 点击逻辑 } override func viewDidLoad() { super.viewDidLoad() // 现在可以正常设置按钮的layer属性啦 butLoginButton.layer.borderWidth = 1 butLoginButton.layer.borderColor = UIColor.gray.cgColor butSignupButton.layer.cornerRadius = 5 // 你的txtUsername设置是对的,继续保持即可 txtUsername.layer.borderWidth = 1 }
报错的原因就是你之前可能误写了butLogin.layer,但butLogin是个方法(类型是(AnyObject) -> ()),不是UIButton实例,自然没有layer属性啦~
内容的提问来源于stack exchange,提问作者Boris Huang
相关产品推荐
相关产品推荐

