63709


[Qiitaの記事](https://qiita.com/minami1389227/items/ac5d605ad0e8dfcb6998)を参考に、横スクロールビューにボタンを配置するコードを書いています。  
以下のコードにおいて、buttonAを押したときに、buttonBのisHiddenをtrueにするにはどうしたら良いですか？

[code]

            let titles = ["buttonA","buttonB"] //ボタンのタイトル
    
     　　    //ボタンの横幅
            let tabLabelWidth:CGFloat = scrollView.frame.height
            //ボタンの縦幅(UIScrollViewと一緒にします)
            let tabLabelHeight:CGFloat = scrollView.frame.height
    
            //ボタンのx座標．0から始まり，少しずつずらしていく．
            var originX:CGFloat = 0
    
            for title in titles 
            {
                //UIButtonを作る
                let button = UIButton()
                button.frame = CGRect(x:originX, y:0, width:tabLabelWidth, height:tabLabelHeight)
    
                //ボタンに画像をセット
                if title == "buttonA"
                {
                    let picture = UIImage(named: "buttonA")
                    button.setImage(picture, for: .normal)
                    //ボタンを押したときの動作
                    button.addTarget(self, action: #selector(buttonEvent_buttonA(_:)), for: UIControl.Event.touchUpInside)
                }
                else if title == "buttonB"
                {
                    let picture = UIImage(named: "buttonB")
                    button.setImage(picture, for: .normal)
                    //ボタンを押したときの動作
                    button.addTarget(self, action: #selector(buttonEvent_buttonB(_:)), for: UIControl.Event.touchUpInside)
                }
             }
    
    //buttonAを押したときのイベント
    @objc func buttonEvent_buttonA(_ sender: UIButton)
    {
    
    }
    
[/code]


CC BY-SA 4.0
2020-03-09T04:53:43.093
63683
2020-03-09T17:16:46.033
36446
question
swift ios
コードで2つのボタンを追加し、ボタンAを押したときにボタンBのisHiddenをtrueにする方法


**_buttonBのisHiddenをtrueにする_** という目的があるのであれば、buttonBのインスタンスにアクセス出来ないといけません。

あなたのコードではせっかく作成した`UIButton`のインスタンスを捨ててしまっている(実際にはview階層に追加した上で、`originX`を更新する、という処理が必要なはずです。必要な処理を省略してしまうと全く意味をなさないこともあるので、関連処理については省略しない方が良いでしょう。)のですが、これをインスタンスプロパティに保持しておけばいいでしょう。

今すぐには要らないけど、buttonA(あるいは将来追加するであろうボタン)も全部保持するなら配列を使用してこんな風に書けるでしょう。

[code]

        //ボタンのインスタンスを配列で保持する
        var buttons: [UIButton] = []
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let titles = ["buttonA", "buttonB"] //ボタンのタイトル
    
            //タブの横幅
            let tabLabelWidth:CGFloat = scrollView.frame.height
            //タブの縦幅(UIScrollViewと一緒にします)
            let tabLabelHeight:CGFloat = scrollView.frame.height
    
            //タブのx座標．0から始まり，少しずつずらしていく．
            var originX:CGFloat = 0
    
            //titlesで定義したボタンの配列を作成
            self.buttons = titles.map {title in
                //UIButtonを作る
                let button = UIButton(type: .custom)
                button.frame = CGRect(x:originX, y:0, width:tabLabelWidth, height:tabLabelHeight)
                //ボタンに画像をセット
                let picture = UIImage(named: title)
                button.setImage(picture, for: .normal)
    
                scrollView.addSubview(button)
    
                originX += tabLabelWidth
    
                return button
            }
            //ボタンを押したときの動作
            //ボタンごとに異なる処理を無理にループの中に書かない
            buttons[0].addTarget(self, action: #selector(buttonAPressed(_:)), for: .touchUpInside)
            buttons[1].addTarget(self, action: #selector(buttonBPressed(_:)), for: .touchUpInside)
    
            scrollView.contentSize = CGSize(width: originX, height: tabLabelHeight)
        }
    
[/code]

(iOS/Swiftでは`buttonEvent_buttonA`みたいなアンダーライン区切りのメソッド名は普通使わないので、書き換えてあります。何か他OSの他言語で書かれたコードみたいに見えてしまいます…。)

こう書くことで、`buttons`には、`titles`に対応した`UIButton`のインスタンスが順に入ることになりますから、`buttons[1]`がbuttonBを表すことになります。

[code]

        @objc func buttonAPressed(_ :UIButton) {
            buttons[1].isHidden = true
        }
    
[/code]


CC BY-SA 4.0
2020-03-09T17:16:46.033
63709
2020-03-09T17:16:46.033
13972
63683
answer