본문 바로가기
Xcode/ERROR

ERROR) UIButton.addTarget이 작동 안 될 때 In Code

by 후르륵짭짭 2020. 12. 25.
728x90
반응형

 

안녕하세요 후르륵짭짭입니다.

이번에 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

 

UIButton not responding used in a custom UITableViewCell

I know this issue is already been asked few times in SO. Despite trying those out, I am still unable to solve my problem. I am using a UITableView inside a UIViewController. I have a custom

stackoverflow.com

 

Large Title에 Button을 넣는 방법 : 

uptech.team/blog/build-resizing-image-in-navigation-bar-with-large-title

 

How to build resizing Image in Navigation Bar with Large Title

This 5-steps tutorial shows the implementation of an image which resizes according to the height of navigation bar with a large title

uptech.team

 

Large Title에 Button을 넣는 방법 - StackOverflow : 

stackoverflow.com/a/49798267/13065642

 

Add a button to large title navigation bar

Summary I'd like to add a button to a large title navigation bar like App Store's account button. Flow Desired: Button is visible only when large titles is enabled Allow transition from large ti...

stackoverflow.com

 

728x90
반응형

댓글