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

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

ただいまの
回答率

90.62%

  • Swift

    6997questions

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

  • Xcode

    3986questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    3887questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Objective-C

    1172questions

    Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

  • iPhone

    960questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

swiftでのTableViewに関する質問

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,060

summer

score 4

swift docsというサイトにある UITableViewに追加・削除機能を追加 という項目で、TableViewやNavigationControllerなどをstoryboardで実装して同じ機能を付けたいのですがうまくいきません。現在のViewController.swiftのコードはこちらです---

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    let myItems: NSMutableArray = ["TEST1", "TEST2", "TEST3"]
    var myTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationItem.rightBarButtonItem = self.editButtonItem()
        myTableView = UITableView()
        myTableView.allowsSelectionDuringEditing = true
        myTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
        return myItems.count
    }
    
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        let cell=tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
        cell.textLabel?.text="\(myItems[indexPath.row])"
        return cell
    }
    
    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        var sec=0
        sec=section+1
        return "セクション"+sec.description
    }
    
    /*
    編集ボタンが押された際に呼び出される
    */
    override func setEditing(editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)
        
        // TableViewを編集可能にする
        myTableView.setEditing(editing, animated: true)
        
        // 編集中のときのみaddButtonをナビゲーションバーの左に表示する
        if editing {
            println("編集中")
            let addButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: "addCell:")
            self.navigationItem.setLeftBarButtonItem(addButton, animated: true)
        } else {
            println("通常モード")
            self.navigationItem.setLeftBarButtonItem(nil, animated: true)
        }
    }
    
    /*
    addButtonが押された際呼び出される
    */
    func addCell(sender: AnyObject) {
        println("追加")
        
        // myItemsに追加.
        myItems.addObject("add Cell")
        
        // TableViewを再読み込み.
        myTableView.reloadData()
    }
    
    /*
    Cellを挿入または削除しようとした際に呼び出される
    */
    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        
        // 削除のとき.
        if editingStyle == UITableViewCellEditingStyle.Delete {
            println("削除")
            
            // 指定されたセルのオブジェクトをmyItemsから削除する.
            myItems.removeObjectAtIndex(indexPath.row)
            
            // TableViewを再読み込み.
            myTableView.reloadData()
        }
    }

    
}

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

check解決した方法

+1

できました!!

どうやらConstraintsの設定をしていなかったのが原因らしく、画面の右側がシミュレーターでひょうじされていなかったようです。

お世話になりました!!
また機会がありましたら回答宜しくお願いします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/05/14 09:19

    summerさん、よかったですね。
    あまり役に立てませんでしたが、解決できてなによりです。

    キャンセル

+1

こんにちは。

Cellに値を渡す箇所にある

let cell=tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell



let cell=tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell  // 「!」を削除

と、as演算子のエクスクラメーションマーク(!)を削除すれば、このままでもビルドは(とりあえず)成功します。

ただし、DataSourceや Delegateの設定や、編集中の Cellの選択が許可されていないだけでなく、TableViewが Viewに追加されていませんので、テーブルは表示されないのではないかと思うのですが、いかがでしょうか。
もういちど、参考にされたソースコードをごらんになることをおすすめします。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/05/13 12:32

    回答ありがとうございます。

    少し自分の説明不足のようです。元のソースではTableViewなどが全てコードで実装されているのですが、それをTableViewなどの実装をstoryboard上、GUIで実装した上で同じ機能をつけたいと思っているところです。

    つまりはセルやTableViewはstoryboard上で実装してある状態です。

    開発を始めてまだ間もないため質問の仕方やわけわからない部分がコードにあるかと思いますがすみません。

    キャンセル

  • 2015/05/13 13:34

    summerさん、コメント(返信)をいただきありがとうございます。

    storyboardを使用して TableViewを実装した場合には、

    @IBOutlet weak var tableView: UITableView!

    といったコードが記述されているはずなのですが……

    これは、storyboardで追加した TableViewを ViewController.swiftに関連づけることでソースコードとして反映されるものです。
    もしも、関連づけの作業を行っているようでしたら、これは無視してください。

    そうであれば、最低限必要なメソッドは書かれていますので、ビルドすればなにかしら表示されるはずです。

    キャンセル

  • 2015/05/13 14:26

    またまたありがとうございます。
    アドバイスを元に少し書き直してみました。

    import UIKit

    class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var TableView: UIView!
    @IBOutlet weak var myTableView: UITableView!
    @IBOutlet weak var MyCell: UITableViewCell!
    let myItems: NSMutableArray = ["TEST1", "TEST2", "TEST3"]

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    myTableView.delegate = self
    myTableView.dataSource = self
    myTableView.allowsSelectionDuringEditing = true

    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    }

    /*
    Cellの総数を返す
    (実装必須)
    */
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return myItems.count
    }

    /*
    Cellに値を設定する
    (実装必須)
    */
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) as! UITableViewCell

    // Cellに値を設定.
    cell.textLabel?.text = "\(myItems[indexPath.row])"

    return cell
    }

    /*
    編集ボタンが押された際に呼び出される
    */
    override func setEditing(editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: animated)

    // TableViewを編集可能にする
    myTableView.setEditing(editing, animated: true)

    // 編集中のときのみaddButtonをナビゲーションバーの左に表示する
    if editing {
    println("編集中")
    let addButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: "addCell:")
    self.navigationItem.setLeftBarButtonItem(addButton, animated: true)
    } else {
    println("通常モード")
    self.navigationItem.setLeftBarButtonItem(nil, animated: true)
    }
    }

    /*
    addButtonが押された際呼び出される
    */
    func addCell(sender: AnyObject) {
    println("追加")

    // myItemsに追加.
    myItems.addObject("add Cell")

    // TableViewを再読み込み.
    myTableView.reloadData()
    }

    /*
    Cellを挿入または削除しようとした際に呼び出される
    */
    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {

    // 削除のとき.
    if editingStyle == UITableViewCellEditingStyle.Delete {
    println("削除")

    // 指定されたセルのオブジェクトをmyItemsから削除する.
    myItems.removeObjectAtIndex(indexPath.row)

    // TableViewを再読み込み.
    myTableView.reloadData()
    }
    }



    }

    このように書いたのですが、ビルドの時に
    The myCell outlet from the ViewController to the UITableViewCell is invalid. Outlets cannot be connected to repeating content.
    というエラーがでてビルドできません。ひとつにつき何度もOutletできませんという意味にしかとれず困っています。毎度すいません。

    キャンセル

  • 2015/05/13 16:17

    storyboardで追加するのは、Table Viewだけですので、

    @IBOutlet weak var myTableView: UITableView!

    の1行だけでいいはずなのですが……

    下記のブログエントリーをご参考ください。
    http://dev.classmethod.jp/references/ios-8-xcode-6-swift-listview/

    なお、この場合も as演算子のエクスクラメーションマーク(!)は不要です。

    どうしても storyboardを使わなければならない理由がないのであれば、参考にされたサイトのソースコードを改変されたほうがよいかもしれませんね。

    キャンセル

  • 2015/05/13 17:52

    回答ありがとうございます。

    なんとかアドバイスをもとに

    import UIKit

    class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    //@IBOutlet weak var myUIView: UIView!
    @IBOutlet weak var myTableView: UITableView!
    //@IBOutlet weak var myCell: UITableViewCell!

    let myItems: NSMutableArray = ["TEST1", "TEST2", "TEST3"]

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    myTableView.delegate = self
    myTableView.dataSource = self
    self.navigationItem.rightBarButtonItem = self.editButtonItem()
    myTableView.allowsSelectionDuringEditing = true

    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    }

    /*
    Cellの総数を返す
    (実装必須)
    */
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return myItems.count
    }

    /*
    Cellに値を設定する
    (実装必須)
    */
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell

    // Cellに値を設定.
    cell.textLabel?.text = "\(myItems[indexPath.row])"

    return cell
    }

    /*
    編集ボタンが押された際に呼び出される
    */
    override func setEditing(editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: animated)

    // TableViewを編集可能にする
    myTableView.setEditing(editing, animated: true)

    // 編集中のときのみaddButtonをナビゲーションバーの左に表示する
    if editing {
    println("編集中")
    let addButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: "addCell:")
    self.navigationItem.setLeftBarButtonItem(addButton, animated: true)
    } else {
    println("通常モード")
    self.navigationItem.setLeftBarButtonItem(nil, animated: true)
    }
    }

    /*
    addButtonが押された際呼び出される
    */
    func addCell(sender: AnyObject) {
    println("追加")

    // myItemsに追加.
    myItems.addObject("add Cell")

    // TableViewを再読み込み.
    myTableView.reloadData()
    }

    /*
    Cellを挿入または削除しようとした際に呼び出される
    */
    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {

    // 削除のとき.
    if editingStyle == UITableViewCellEditingStyle.Delete {
    println("削除")

    // 指定されたセルのオブジェクトをmyItemsから削除する.
    myItems.removeObjectAtIndex(indexPath.row)

    // TableViewを再読み込み.
    myTableView.reloadData()
    }
    }
    }

    こちらのコードによりほぼ望み通りの結果が得られているのですが

    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {

    // 削除のとき.
    if editingStyle == UITableViewCellEditingStyle.Delete {
    println("削除")

    // 指定されたセルのオブジェクトをmyItemsから削除する.
    myItems.removeObjectAtIndex(indexPath.row)

    // TableViewを再読み込み.
    myTableView.reloadData()
    }
    }

    こちらの部分のコードが機能してくれません。追加はできるし、エディットボタンを押せば編集モードになるのですが、マイナスの記号を押してもDeleteが表示されず、セルを削除できません。

    いろいろおつきあいしていただきましてありがとうございます。あともう少し力を貸してください。

    キャンセル

  • 2015/05/13 22:33

    いろいろ試しているのですが、どうやら

    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {

    // 削除のとき.
    if editingStyle == UITableViewCellEditingStyle.Delete {
    println("削除")

    // 指定されたセルのオブジェクトをmyItemsから削除する.
    myItems.removeObjectAtIndex(indexPath.row)

    // TableViewを再読み込み.
    myTableView.reloadData()
    }
    }

    このコードが機能してないというよりはEdit後のDeleteが表示されないのが原因のようです。storyboardでcellを選択してaccessaryでdisclosure indicatorを選択しても反映しないのでどうやらセル自体に問題がありそうなのですが・・・。

    キャンセル

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

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

関連した質問

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

  • Swift

    6997questions

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

  • Xcode

    3986questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    3887questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Objective-C

    1172questions

    Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

  • iPhone

    960questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。