こんにちは。
今どうしても理屈でなんでだめなのか理解できない問題がありますので、アドバイスをいただけないでしょうか。
やりたいことは、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) } } } }
}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/03 07:22