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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

2回答

1894閲覧

Swift2 TableViewの引っ張って更新の実現方法がわからない・

m_tsukasa

総合スコア7

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/06/27 05:02

編集2016/06/27 07:10

###前提・実現したいこと
TableViewのデータの更新を「引っ張って更新」で行いたい。

###発生している問題・エラーメッセージ
更新をかけようとしたところ、インデックスエラーが表示される状態です。

###該当のソースコード

Swift

1import UIKit 2 3class TableViewController: UITableViewController { 4 5 var bbsData:[BbsData] = [BbsData]() 6 var offset = 0 7 var userId: String? 8 @IBOutlet var filterBtn: UIBarButtonItem! 9 10 func getData(){ 11 let url = NSURL(string:"データを取得するPHPへのURL") 12 let config = NSURLSessionConfiguration.defaultSessionConfiguration() 13 let session = NSURLSession(configuration: config) 14 let req = NSMutableURLRequest(URL: url!) 15 req.HTTPMethod = "POST" 16 req.HTTPBody = ("データの絞込み用POSTパラメータ").dataUsingEncoding(NSUTF8StringEncoding) 17 let task = session.dataTaskWithRequest(req, completionHandler: { 18 (data,resp,err) in 19 do{ 20 let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary 21 if json.count > 0{ 22 if let bbsDatas = json["bbsData"] as? NSArray{ 23 self.offset += bbsDatas.count 24 for data1 in bbsDatas{ 25 let basebaseUrl: String = "DBからの画像を表示するPHPへのURL" 26 let commentId = data1["commentId"] as! String 27 let baseUrl = basebaseUrl + commentId 28 let url = baseUrl as NSString 29 let nameStr = data1["userName"] as? NSString 30 let ageStr = data1["age"] as? NSString 31 let prefStr = data1["pref"] as? NSString 32 let commentStr = data1["comment"] as? NSString 33 let userId = data1["userListId"] as? NSString 34 let gender = data1["gender"] as? NSString 35 self.setupBbsDatas(url, nameStr: nameStr, ageStr: ageStr, prefStr: prefStr, commentStr: commentStr, userId: userId, gender: gender) 36 } 37 } 38 self.tableView.reloadData() 39 } 40 }catch{ 41 print("error") 42 } 43 }) 44 task.resume() 45 46 } 47 48 override func viewDidLoad() { 49 super.viewDidLoad() 50 self.refreshControl = UIRefreshControl() 51 self.refreshControl?.attributedTitle = NSAttributedString(string: "引っ張って更新") 52 self.refreshControl?.addTarget(self, action: #selector(TableViewController.refresh), forControlEvents: UIControlEvents.ValueChanged) 53 self.tableView.addSubview(refreshControl!) 54 let backBtn = UIBarButtonItem() 55 backBtn.title = "戻る" 56 self.navigationItem.backBarButtonItem = backBtn 57 getData() 58 } 59 60 func refresh(){ 61 self.refreshControl?.endRefreshing() 62 bbsData = [] 63 for i:NSInteger in 0 ..< tableView.numberOfSections { 64 for j:NSInteger in 0 ..< tableView.numberOfRowsInSection(i){ 65 bbsData.removeAtIndex(j) 66 tableView.cellForRowAtIndexPath(NSIndexPath(forRow: j, inSection: i))?.removeFromSuperview() 67 } 68 } 69 70 let ending = bbsData.count 71 for i in 0 ..< ending { 72 self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 73 } 74 75 self.offset = 0 76 getData() 77 78 } 79 80 @IBAction func filterClick(sender: UIBarButtonItem){ 81 let storyboard = UIStoryboard(name:"Main",bundle:nil) 82 let nextView:UIViewController = storyboard.instantiateViewControllerWithIdentifier("filterSelect") 83 nextView.modalTransitionStyle = UIModalTransitionStyle.PartialCurl 84 navigationController?.pushViewController(nextView, animated: true) 85 } 86 87 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 88 userId = bbsData[indexPath.row].userId as String 89 tableView.deselectRowAtIndexPath(indexPath, animated: true) 90 let storyboard = UIStoryboard(name:"DetailProf",bundle:nil) 91 let nextView:UIViewController = storyboard.instantiateViewControllerWithIdentifier("detailProfile") 92 nextView.modalTransitionStyle = UIModalTransitionStyle.PartialCurl 93 let viewController = nextView as! DetailProf 94 viewController.userListId = userId 95 navigationController?.pushViewController(nextView, animated: true) 96 } 97 98 override func didReceiveMemoryWarning() { 99 super.didReceiveMemoryWarning() 100 } 101 102 // MARK: - Table view data source 103 104 override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 105 return 1 106 } 107 108 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 109 return bbsData.count 110 } 111 112 113 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 114 let cell: bbsTableCell = tableView.dequeueReusableCellWithIdentifier("bbsDataCell", forIndexPath: indexPath) as! bbsTableCell 115 cell.setCell(bbsData[indexPath.row]) 116 if (self.bbsData.count - 1) == indexPath.row { 117 getData() 118 } 119 return cell 120 } 121 122 func setupBbsDatas(bbsImage: NSString, nameStr: NSString?, ageStr: NSString?, prefStr: NSString?, commentStr: NSString?, userId: NSString?, gender: NSString?){ 123 let data = BbsData(bbsImage: bbsImage, nameStr: nameStr, ageStr: ageStr, prefStr: prefStr, commentStr: commentStr, userId: userId, gender: gender) 124 bbsData.append(data) 125 } 126}

bbsTableCell.swift

Swift

1import UIKit 2 3class bbsTableCell: UITableViewCell { 4 5 @IBOutlet var postImage: UIImageView! 6 @IBOutlet var nameLabel: UILabel! 7 @IBOutlet var ageLabel: UILabel! 8 @IBOutlet var prefLabel: UILabel! 9 @IBOutlet var commentLabel: UILabel! 10 @IBOutlet var genderImage: UIImageView! 11 12 override func awakeFromNib() { 13 super.awakeFromNib() 14 // Initialization code 15 } 16 17 override func setSelected(selected: Bool, animated: Bool) { 18 super.setSelected(selected, animated: animated) 19 20 // Configure the view for the selected state 21 } 22 23 func setCell(bbsData: BbsData){ 24 25 nameLabel.text = bbsData.nameStr as String 26 ageLabel.text = bbsData.ageStr as String + "才" 27 prefLabel.text = bbsData.prefStr as String 28 commentLabel.text = bbsData.commentStr as String 29 switch bbsData.gender { 30 case "男性": 31 genderImage.image = UIImage(named: "genderMale") 32 33 case "女性": 34 genderImage.image = UIImage(named: "genderFemale") 35 36 default: 37 genderImage.image = UIImage(named: "genderNodisplay") 38 39 } 40 let url = NSURL(string: bbsData.bbsImage as String) 41 let requestUrl = NSURLRequest(URL: url!) 42 NSURLConnection.sendAsynchronousRequest(requestUrl, queue: NSOperationQueue.mainQueue()){(response,data,error) -> Void in 43 if error != nil{ 44 //print(error) 45 }else{ 46 if let dlImage = UIImage(data: data!){ 47 self.postImage.image = dlImage 48 } 49 } 50 } 51 52 } 53 54}

###考察してみたこと
Android版を作成した時に行った方法として、
TableView(ListView)のリセット(全削除) → 再データセットの流れで実現できたので、
同じような処理ができないかと模索した結果
TableViewのリセット(全削除)の方法がわからない状態でいまに至ってます。

###補足情報(言語/FW/ツール等のバージョンなど)
Xcode7.3
Swift2.*

###できればもうひとつの質問もよろしくお願いいたします。
https://teratail.com/questions/39264

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

ご教授頂いたコードを以下のように修正したところ
希望通りの動作をいたしましました。

Swift

1func refresh() { 2 bbsData = [] //全データ削除 3 tableView.reloadData() //表示のリロード <- 追加 4 getData() //データ更新 5}

投稿2016/06/27 07:59

m_tsukasa

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

refreshの中で何やらややこしいことをしていますが、セルを作り直す必要はなく、元データ(bbsData)を更新して、テーブルをリロードしてやるだけでいいです。

ちゃんとソース読んでないですが、

swift

1func refresh() { 2 bbsData = [] //全データ削除 3 getData() //データ更新 4}

これでいけそうな気がしないでもないです。

投稿2016/06/27 05:30

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m_tsukasa

2016/06/27 05:41

早速のご回答ありがとうございます。 上記のソースに変更で実行してみたのですが index out of rangeのエラーが出て更新されないです。
fuzzball

2016/06/27 06:19

どこでエラーが出ているかくらい書きませんか。
m_tsukasa

2016/06/27 06:24

すみません、更新をするために引っ張り更新のマークが表示されたあと 手を離すと、数秒後にエラーを出力する形です。
m_tsukasa

2016/06/27 07:09

エミュレータ環境で実行したところ、 cellForRowAtIndexPath内の cell.setCell(bbsData[indexPath.row])にて Index out of rangeのエラーが出ます、 該当クラスメソッドは別ファイルのため、上記質問に追記いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問