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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

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

Xcode

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

Swift

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

Parse.com

Parse は BaaS ( Backend as a Service)モバイルアプリ開発のサーバサイド部分を肩代わりしてくれるサービスです

Swift 2

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

Q&A

解決済

1回答

2379閲覧

ScrollView上に可変のUITableを2つ設置するとき

c8h14

総合スコア12

Objective-C

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

Xcode

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

Swift

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

Parse.com

Parse は BaaS ( Backend as a Service)モバイルアプリ開発のサーバサイド部分を肩代わりしてくれるサービスです

Swift 2

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

0グッド

0クリップ

投稿2015/10/03 01:58

編集2015/10/03 02:09

こんにちは。
今どうしても理屈でなんでだめなのか理解できない問題がありますので、アドバイスをいただけないでしょうか。

やりたいことは、2種類のデータ(Fares,Options)をサーバー上(Parse,com)から非同期で取得し、それぞれを別のテーブルに並べて表示させるということです。(どちらもデータが存在しないケースもあります)。
そして、ScrollViewのcontentSizeもデータ数によって可変にしています。

※1と※2については、どちらで呼び出すパターンも試しています。

どちらのケースも、Fareの見出しとテーブルは表示されますが、optionについてはどちらも表示されません。
また、Fareとoptionのデータ取得順番を逆にした場合には、optionの身が表示されるので、呼び出す関数は間違っていないと思います。

説明が長くなりましたが、何卒ヒントをお願いいたします。

class DetailInfoViewController: UIViewController, UICollectionViewDelegate,UICollectionViewDataSource,UITableViewDataSource, UITableViewDelegate{

@IBOutlet var scrollView: UIScrollView! var fareTableView:UITableView? var fares:[[String]] = []{ didSet{ self.displayFareDatas() //データがあればテーブルの見出しを設定 self.settingFareTableView() //データがあればテーブルを表示 self.viewDidLayoutSubviews() fareTableView?.reloadData() } } var optionTableView:UITableView? var optionHight:CGFloat = 468 //オプションタイトルを設定する高さ var options:[[String]] = []{ didSet { self.displayOptionDatas() self.settingOptionTableView() self.viewDidLayoutSubviews() optionTableView?.reloadData() } } override func viewDidLoad() { super.viewDidLoad() //データを取得する self.getFareDatas(driverAndCar.company) self.getOptionDatas(driverAndCar.company) ・・・ ※1 } //レイアウトの決定(scrollviewの設定) override func viewDidLayoutSubviews() { var height = 468 //料金もオプションもない時の数値 //faresのデータ数に応じて、scrollviewの高さを変える if fares.count != 0 { height = height + 60 * fares.count } //optionのデータ数に応じて、ScrollViewの高さを変える if options.count != 0 { height = height + 44 + 60 * options.count } scrollView.contentSize = CGSizeMake(320, CGFloat(height)) } //運賃タイトル設定 func displayFareDatas(){ //「運賃」タイトル let fareTitleLabel = UILabel(frame: CGRectMake(0, 468, 320, 44)) fareTitleLabel.font = UIFont.systemFontOfSize(15) fareTitleLabel.text = "運賃(詳細はお電話でご確認ください。)" fareTitleLabel.textAlignment = NSTextAlignment.Center fareTitleLabel.backgroundColor = UIColor.yellowColor() scrollView.addSubview(fareTitleLabel) } //オプションタイトル設定 func displayOptionDatas(){ //「オプション」タイトル let optionTitleLabel = UILabel(frame: CGRectMake(0, optionHight, 320, 44)) optionTitleLabel.font = UIFont.systemFontOfSize(15) optionTitleLabel.text = "その他のオプション" optionTitleLabel.textAlignment = NSTextAlignment.Center optionTitleLabel.backgroundColor = UIColor.yellowColor() self.scrollView.addSubview(optionTitleLabel) } // MARK: - TableView func settingFareTableView(){ fareTableView = UITableView(frame: CGRectMake(0, 512, 320, CGFloat(60 * fares.count)))

// Cell名の登録をおこなう.
fareTableView!.registerClass(UITableViewCell.self, forCellReuseIdentifier: "FareCell")
// DataSourceの設定をする.
fareTableView!.dataSource = self
// Delegateを設定する.
fareTableView!.delegate = self
// Viewに追加する.
scrollView.addSubview(fareTableView!)

fareTableView?.tag = 1 } func settingOptionTableView(){ optionTableView = UITableView(frame: CGRectMake(0, optionHight + 44, 320, CGFloat(60 * options.count))) // Cell名の登録をおこなう. optionTableView!.registerClass(UITableViewCell.self, forCellReuseIdentifier: "OptionCell") // DataSourceの設定をする. optionTableView!.dataSource = self // Delegateを設定する. optionTableView!.delegate = self // Viewに追加する. scrollView.addSubview(optionTableView!) optionTableView?.tag = 2 } /* Cellの数を返すデータソースメソッド. */ func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { var cellCount = 0 if tableView.tag == 1{ cellCount = fares.count }else if tableView.tag == 2{ cellCount = options.count } return cellCount

// return driverAndCar.options.count
}

/* Cellに値を設定するデータソースメソッド. (実装必須) */ func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // 再利用するCellを取得する.

// let cell = tableView.dequeueReusableCellWithIdentifier("Cell",forIndexPath:indexPath)
var cell:UITableViewCell = UITableViewCell()

if tableView.tag == 1{ cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "FareCell") let fare:[String] = fares[indexPath.row] cell.textLabel?.text = fare[0] cell.detailTextLabel?.text = fare[1] } else if tableView.tag == 2{ cell = UITableViewCell(style: UITableViewCellStyle.Value2, reuseIdentifier: "OptionCell") let option:[String] = options[indexPath.row] //Cellに値を設定 cell.textLabel?.text = option[0] cell.textLabel?.font = UIFont.systemFontOfSize(15) cell.detailTextLabel?.text = option[1] cell.detailTextLabel?.font = UIFont.systemFontOfSize(15) } return cell } //cellsの高さを設定 func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return CGFloat(60) } // MARK: - Parse(optionのデータを取得する) func getFareDatas(companyObject:PFObject!){ let query = PFQuery(className: "Fare") query.whereKey("company", equalTo: companyObject) query.orderByAscending("order") query.findObjectsInBackgroundWithBlock { (objects:[PFObject]?, error:NSError?) -> Void in if error == nil { self.optionHight = self.optionHight + self.optionHight + CGFloat(60 * (objects?.count)!) for object in objects! { let title = object["title"] as! String var fareDetail:String! if object["fareDetail"] == nil { fareDetail = "" }else{ fareDetail = object["fareDetail"] as! String } let fare:[String] = [title,fareDetail] self.fares.append(fare) } } self.getOptionDatas(companyObject) ・・・ ※2 } } func getOptionDatas(companyObject:PFObject!){ let query = PFQuery(className: "Option") query.whereKey("company", equalTo: companyObject) query.orderByAscending("order") query.findObjectsInBackgroundWithBlock { (objects:[PFObject]?, error:NSError?) -> Void in if error == nil { for object in objects! { let item = object["item"] as! String let fare = String(object["fare"] as! Int) + "円" let option:[String] = [item,fare] self.options.append(option) } } } }

}

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

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

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

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

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

guest

回答1

0

ベストアンサー

ざっとしか見ていませんが、気になるのは
self.optionHight = self.optionHight + self.optionHight + CGFloat(60 * (objects?.count)!)

これは
self.optionHight = self.optionHight + CGFloat(60 * (objects?.count)!)
としたかったんじゃないんでしょうか?

これが原因で、ScrollViewのcontentSize範囲よりずっと下のところに
optionTableViewを表示しているという可能性はないですか?

あと、質問で聞かれていることとは別の話ですが、fareTableView,optionTableViewともに
データを読み込むたびに作り直している雰囲気がありますが、
作り直すなら、既にaddSubviewしているテーブルをどこかで
removeFromSubviewする必要ないですか?
今の状態は、データを読み込みながら新しいテーブルをどんどん
上乗せしていませんか?

投稿2015/10/03 03:19

編集2015/10/03 03:22
TakeOne

総合スコア6299

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

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

c8h14

2015/10/03 07:22

>これが原因で、ScrollViewのcontentSize範囲よりずっと下のところに >optionTableViewを表示しているという可能性はないですか? TakeOneさん、ありがとうございます! まさにおっしゃる通りです!!本当に助かりました。 addSubViewが重複してるかもしれないのかな?というのは気になってましたが、やっぱりそうなんですね。 こちらもアドバイスありがとうございます! 今回初めてstorybord使わずにやってるので、この辺りもうちょっと勉強してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問