안녕하세요 후르륵짭짭입니다.
이번에 Code로 TableView를 구현 할 때, Button을 넣는데 작동하지 않는 것 입니다...
두가지에 대해 문제가 있는데 각각 알아보도록 하겠습니다.
** Button의 addTarget은 lazy나 밖으로 설정 **
let naviButton : UIButton = {
let button = UIButton()
button.setTitle("Hello", for: .normal)
button.addTarget(self, action: #selector(click), for: .touchUpInside)
button.setTitleColor(.cyan, for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()
이렇게 Closure에 addTarget을 넣었는데 되지 않았습니다.
그래서 열심히 찾아봤는데,
lazy var naviButton : UIButton = {
let button = UIButton()
button.setTitle("Hello", for: .normal)
button.addTarget(self, action: #selector(click), for: .touchUpInside)
button.setTitleColor(.cyan, for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()
lazy var 로 해주면 해결이 됩니다.
( 참고로 lazy를 사용하면 처음 사용이 될 때, 데이터를 생성하는 것을 의미합니다. )
이것을 보면 addTarget은 처음에 셋팅 되는 것이 아니라 후에 값이 생기는 것인 거 같습니다.
따라서 위에 처럼 lazy로 해주거나 아니면 밖으로 빼주셔야합니다.
private func navigationItem(){
guard let navigationbar = navigationController?.navigationBar else {return}
navigationbar.addSubview(naviButton)
naviButton.addTarget(self, action: #selector(click), for: .touchUpInside)
NSLayoutConstraint.activate([
naviButton.trailingAnchor.constraint(equalTo: navigationbar.trailingAnchor),
naviButton.bottomAnchor.constraint(equalTo: navigationbar.bottomAnchor),
])
}
** TableView Cell에서 addTarget이 작동 안하는 문제 **
아래 처럼 Code를 작성 했는데, 작동이 안 됐습니다.
private func setUpButton(){
addSubview(Button)
Button.addTarget(self, action: #selector(testclick), for: .touchUpInside)
NSLayoutConstraint.activate([
Button.topAnchor.constraint(equalTo: topAnchor),
Button.bottomAnchor.constraint(equalTo: bottomAnchor),
Button.leadingAnchor.constraint(equalTo: leadingAnchor),
Button.trailingAnchor.constraint(equalTo: trailingAnchor)
])
}
이렇게 했지만 작동이 되지 않았습니다.
문제의 원인은 TableView의 Cell은 ContentView가 있는데,
위에 처럼 하면 ContentView 아래에 생기기 때문에 되지가 않았습니다.
따라서 ContentView.addSubView를 해줘야 합니다.
private func setUpButton(){
//Cell 위에다가 올리면 ContentView 밑에 넣기 때문에 안됀다,,,
//Cell의 contentView 위에 Button을 올려야 한다.
//그냥 대부분의 Cell을 사용하면 Content View 위에 올려는게 맞는 듯
contentView.addSubview(Button)
//그리고 Button의 addTarget은 init Closure 안에 넣어서 실행 시키면 안됀댜.
//그래서 이렇게 밖으로 빼야한다.
Button.addTarget(self, action: #selector(testclick), for: .touchUpInside)
NSLayoutConstraint.activate([
Button.topAnchor.constraint(equalTo: contentView.topAnchor),
Button.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
Button.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
Button.trailingAnchor.constraint(equalTo: contentView.trailingAnchor)
])
}
이렇게 해주면 정상적으로 작동이 됩니다.
참고 사이트 :
TableVIew Cell에서 UIButton.addTarget이 작동하지 않을 때 :
stackoverflow.com/a/64494180/13065642
Large Title에 Button을 넣는 방법 :
uptech.team/blog/build-resizing-image-in-navigation-bar-with-large-title
Large Title에 Button을 넣는 방법 - StackOverflow :
stackoverflow.com/a/49798267/13065642
댓글