質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • Swift

    7048questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

IBActionでボタンを押した後、UITableview上のdetailTextLabelを一括で非表示にしたい(隠したい)のですがやり方がわかりません。

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 877

shanqi

score 6

 @IBAction func test(sender: AnyObject) {
    
        if(cell.detailTextLabel!.hidden == false)
        {
            cell.detailTextLabel!.hidden = true;
        }
        else
        {
            cell.detailTextLabel!.hidden = false;
        }
        
    }


こうすると Use of unresolved identifier "cell"というエラーがでます。
ちなみにセル上のidentifierはcellにしております。
何卒ご教授いただけると幸いです。よろしくお願いします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

手っ取り早いのはセルを使ってるViewControllerクラス側でdetailTextLabelの表示フラグを持っておくことですかね、cellForRowAtIndexPath関数内で表示フラグを見てdetailTextLabelを表示するかどうかの処理を書いておいて、表示フラグが切り替わったタイミングでreloadDataを呼び出すとうまくいくのではないでしょうか

    var tableView: UITableView!
    
    var isShowDetailTextLabel = false // falseとしてますが初期値としたいBool値で
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cellIdentifier", forIndexPath: indexPath) as! UITableViewCell
        
        cell.detailTextLabel?.hidden = !self.isShowDetailTextLabel
        
        return cell
    }
    
    @IBAction func test(sender: AnyObject) {
        self.isShowDetailTextLabel = !self.isShowDetailTextLabel
        self.tableView.reloadData()
    }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/30 18:25

    ありがとうございます!

    言葉足らずでごめんなさい😥
    自分としては
    ①デフォルトでdetailtextlabel全表示
    ②testボタンを一度押しでdetailtextlabel全非表示
    ③もう一度testボタンを押すとdetailtextlabel全表示に戻る

    といった感じの作りにしたいと考えてます。
    ①〜③を実現しうるコードとは一体どのようにしたら良いのでしょうか?
    ご回答お待ちしております!

    キャンセル

  • 2015/07/30 22:28

    私が提案してるのは①〜③を満たす実装ですよ
    ピンとこない部分があれば聞いて頂ければお答えします

    キャンセル

  • 2015/07/30 23:33

    できました!!ありがとうございます😁

    キャンセル

0

cellという変数が解決できないっていうエラーですね。
ちなみにおっしゃっているidentifierはセルにつけるラベルみたいなものです。

なぜラベルをつけるかというと。
UITableViewは基本的に必要なセル数(表示領域内を埋められるのに十分な数)しか生成しません。
スクロールするとたくさんセルがあるように見えますが、画面外に消えたセルを使いまわして余分なセルを作らないように節約しているんです。

そしてラベルと書いたのは、この「再利用される」セルを識別するためです。
同じラベルがついた未使用のセルがある場合はそれを使い、ない場合は新規作成、となります。



と、ここまでがセルの使われ方の話です。
おそらく上記のラベルを指定して処理を書こうとしているのだと思いますが、説明した通りあくまでラベルとしての意味しかないので、「セルのインスタンス」を取得してそれに対して処理を書かないとなりません。

具体的に言うと、今「表示されている」セルはtableView.visibleCells()で取得できます。
配列が返されるので、これをfor文などでループさせてそのセルに対して処理をしてやれば解決できると思います。

まずはUITableViewのセルがどう扱われるか、というのをしっかりと理解することをおすすめします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/30 12:10 編集

    ありがとうございます!超初心者の僕には少々難しいですが、少しずつ理解していこうと思います。

    ちなみに、tableView.visibleCells()を@IBActionの中に打ち込んでみたのですが、
    cannot invoke "visibleCells" with no argumentsと出てきてしまいます。
    まだ他の要素を加える必要があるのでしょうか?
    それともtableView.visibleCells()を組み込む場所が違うのでしょうか?

    ご回答よろしくお願いします。


    ______________________________

    @IBAction func test(sender: AnyObject) {


    for cell in tableView.visibleCells() as! [UITableViewCell] {

    if(cell.detailTextLabel!.hidden == false)
    {
    cell.detailTextLabel!.hidden = true;
    }
    else
    {
    cell.detailTextLabel!.hidden = false;
    }


    }

    キャンセル

  • 2015/07/30 12:43

    `tableView`は定義されていますか?
    `tableView`は操作したい対象のテーブルを指定してください。
    (`tableView`は決まった名前というわけではないので、状況によっては別の変数名という可能性もあるので)

    キャンセル

  • 2015/07/30 13:07

    できました!!ご丁寧にありがとうございました!

    キャンセル

  • 2015/07/30 13:10

    ただこれは「表示されている」セルなんですね。
    スクロールして下がったら非表示になっていませんでした😥
    全部を隠すにはどうすれば良いのでしょうか??

    キャンセル

  • 2015/07/30 13:16

    そうですね。visible cellsなので。
    ただ、設定をした瞬間は見えているセルだけ設定すればユーザーの目にはすべて設定されたように見えます。

    あとはむずかしく考えず、これから表示されるセルについては生成時に処理してあげればOKです。

    具体的には、cellForRowAtIndexpathメソッドでセルを整形しているかと思いますが、そのときに該当セルの項目の「隠すフラグ」がついていたらそもそもセルの見栄えとして該当箇所を非表示にしてやれば、結果としてすべてのセルが設定されているように見えるはずです。


    文章だけだと難しいですが、

    1. まず見えているセルだけを処理する
    2. 見えていないセルについては、セルが表示されるときにどういう状態かを予め設定して表示させる

    とふたつに処理を分けて考えると分かりやすいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    7048questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • トップ
  • Swiftに関する質問
  • IBActionでボタンを押した後、UITableview上のdetailTextLabelを一括で非表示にしたい(隠したい)のですがやり方がわかりません。