初めて投稿させていただきます
やりたいこととしましては、少々複雑なページ構成で以下のようになっています
- UIView(ラベルや画像などを含む)
- UIView(SegmentedControllを含む)
- UIView(UITableViewを含む)
- UIView(ラベルやボタンを含む)
2.のSegumentedControllを切り替えると3.のUITableViewの内容を切り替えるようにしたいのですが、TableViewCellの内容がだいぶ違うため、このような構成にしてみました。
3.のUIViewはxibで別ファイルで作って、SegmentedControllをきりかえるたびに3.の読み込みView切替りえたいと考えているのですが、こういうやり方は可能なのでしょうか?UIViewの中にUITableViewをいれた場合、delegateとかはUIViewの中に書くことは可能なのでしょうか?
はじめてのiosアプリ開発になるので、そもそもこういうやり方が正しいかわからないし、文章もわかりづらくなってしまったのですが、ご回答いただけますと幸いです
よろしくおねがいします
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
xibから読み込んだUIViewカスタムクラスを使用する場合は、delegateとdataSourceはFiles's Ownerに接続してはいけません。MyViewに接続しましょう。
![![イメージ説明]WIDTH:258
そしてUITableViewをMyViewにアウトレット接続する際は、ObjectをMyViewにしてください。
lang
1// 2// MyView.swift 3// Teratail 4// 5// Created by ATSUSHI on 2015/04/06. 6// Copyright (c) 2015年 ATSUSHI. All rights reserved. 7// 8 9import UIKit 10 11class MyView : UIView, UITableViewDelegate, UITableViewDataSource { 12 13 @IBOutlet var tableView: UITableView! 14 15 var data : NSMutableArray = ["a","b","c","d"] 16 17 required init(coder aDecoder: NSCoder) { 18 super.init(coder: aDecoder) 19 } 20 21 func setData(data : NSMutableArray) { 22 self.data = data 23 self.tableView.reloadData() 24 } 25 26 //クラスメソッド 27 //xibから読み込み 28 class func instance() -> MyView { 29 return NSBundle.mainBundle().loadNibNamed("MyView", owner: self, options: nil).first as MyView 30 } 31 32 func numberOfSectionsInTableView(tableView: UITableView) -> Int { 33 return 1 34 } 35 36 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 37 let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell") 38 cell.textLabel?.text = self.data[indexPath.row] as? String 39 40 return cell 41 } 42 43 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 44 return self.data.count 45 } 46 47}
lang
1// 2// ViewController.swift 3// Teratail 4// 5// Created by ATSUSHI on 2015/04/06. 6// Copyright (c) 2015年 ATSUSHI. All rights reserved. 7// 8 9import UIKit 10 11class ViewController: UIViewController { 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 // Do any additional setup after loading the view, typically from a nib. 16 17 var view : MyView? = MyView.instance() 18 self.view.addSubview(view!) 19 } 20 21 override func didReceiveMemoryWarning() { 22 super.didReceiveMemoryWarning() 23 // Dispose of any resources that can be recreated. 24 } 25 26 27}
投稿2015/04/06 11:43
編集2015/04/06 11:58総合スコア202
0
lang
1self.tableView?.delegate = self 2self.tableView?.dataSorce = self
この記述は入れておきましょう。
そしてnumberOfSectionsInTableViewは実装していますか?
*ちなみに実装していなくてもnumberOfRowsInSectionとcellForRowAtIndexPathは呼ばれるはずです。
yoppy0066さんがどのようにコードを記述しているか全貌はわかりませんが、UITableViewインスタンスは正しく生成していますか?
ちなみに僕の方ではどちらのメソッドも呼び出され、tableViewの表示確認ができました。
一応張っておきます。
lang
1// 2// MyView.swift 3// Teratail 4// 5// Created by ATSUSHI on 2015/04/06. 6// Copyright (c) 2015年 ATSUSHI. All rights reserved. 7// 8 9import UIKit 10 11class MyView : UIView, UITableViewDelegate, UITableViewDataSource { 12 13 //動的にサイズ対応すべき 14 var tableView : UITableView? = UITableView(frame: CGRectMake(0, 0, 375, 677)); 15 16 var data : NSMutableArray = ["a","b","c","d"] 17 18 override init() { 19 super.init() 20 self.setUp() 21 } 22 23 override init(frame: CGRect) { 24 super.init(frame: frame) 25 self.setUp() 26 } 27 28 required init(coder aDecoder: NSCoder) { 29 super.init(coder: aDecoder) 30 self.setUp() 31 } 32 33 func setData(data : NSMutableArray) { 34 self.data = data 35 self.tableView?.reloadData() 36 } 37 38 func setUp() { 39 self.addSubview(self.tableView!) 40 self.tableView?.delegate = self 41 self.tableView?.dataSource = self 42 } 43 44 func numberOfSectionsInTableView(tableView: UITableView) -> Int { 45 return 1 46 } 47 48 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 49 let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell") 50 cell.textLabel?.text = self.data[indexPath.row] as? String 51 52 return cell 53 } 54 55 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 56 return self.data.count 57 } 58 59} 60
lang
1// 2// ViewController.swift 3// Teratail 4// 5// Created by ATSUSHI on 2015/04/06. 6// Copyright (c) 2015年 ATSUSHI. All rights reserved. 7// 8 9import UIKit 10 11class ViewController: UIViewController { 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 // Do any additional setup after loading the view, typically from a nib. 16 17 //動的にサイズ対応すべき 18 var view : MyView? = MyView(frame: CGRectMake(0, 0, 375, 677)) 19 self.view.addSubview(view!); 20 21 } 22 23 override func didReceiveMemoryWarning() { 24 super.didReceiveMemoryWarning() 25 // Dispose of any resources that can be recreated. 26 } 27 28 29} 30 31
![イメージ説明]WIDTH:375
投稿2015/04/06 10:21
編集2015/04/06 10:34総合スコア202
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
lang
1 2class MyView : UIView, UITableViewDelegate, UITableViewDataSource { 3 4 var tableView : UITableView? = UITableView(frame: rect) 5 var data : NSMutableArray = [] 6 7 override init() { 8 super.init() 9 self.setUp() 10 } 11 12 override init(frame: CGRect) { 13 super.init(frame: frame) 14 self.setUp() 15 } 16 17 required init(coder aDecoder: NSCoder) { 18 super.init(coder: aDecoder) 19 self.setUp() 20 } 21 22 func setData(data : NSMutableArray) { 23 self.data = data 24 self.tableView?.reloadData() 25 } 26 27 func setUp() { 28 self.addSubview(self.tableView!) 29 self.tableView?.delegate = self 30 } 31 32 //① 33 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 34 let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell") 35 36 cell.textLabel?.text = self.data[indexPath.row] as? String 37 38 return cell 39 } 40 41 //② 42 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 43 return self.data.count 44 } 45 46}
UITableViewDataSourceプロトコルを紐付けた時、実装すべきメソッドが2つあります。
その2つのメソッドを実装すればエラーが消えると思うので試してみてください。
ソースコード上の①と②のメソッドです。
投稿2015/04/03 13:16
編集2015/04/03 13:21総合スコア202
0
配置場所はわかりませんがこんなイメージでしょうか。
![イメージ説明]WIDTH:304
②を切り替え、③の要素を更新する操作は可能です。
UISegmentedControlはカスタマイズしないのであれば、UISegmentedControlクラスをそのまま使用し、UIViewControllerに貼り付けすればいいと思います。
②が切り替えられた時に呼ばれるメソッドを指定し、そのメソッド内で③の要素を更新する処理を実装します。
lang
1ViewController.m 2//viewDidLoadなど 3- (void)viewDidLoad { 4・ 5・ 6 //self.segmentedControlはUISegmentedControlのインスタンス変数 7 //actionにSEL型でsegmentedControlが切り替えられた時に呼ばれるメソッドを指定します。 8 self.segmentedControl addTarget:self 9 action:@selector(changeValue:) 10 forControlEvents:UIControlEventValueChanged]; 11 [self.view addSubView:self.segmentedControl]; 12・ 13・ 14} 15 16- (void)changeValue:(UISegmentedControl *)sender { 17 //ここにtableViewの内容を更新する処理を記述 18} 19
③のUITableViewも特別カスタマイズしないのであればviewControllerに乗せればいいと思いますが
delegate、dataSourceは UIViewにも実装できます。
lang
1//ThirdView.h 2#import <UIKit/UIKit.h> 3 4@interface ThirdView : UIView <UITableViewDataSource, UITableViewDelegate> 5 6@property (nonatomic, strong) UITableView* tableView; 7@property (nonatomic, setter = setData:) NSArray* data;//可変ならNSMutableArray 8 9@end 10 11//ThirdView.m 12 13//UITableViewDelegateとUITableViewDataSourceの実装すべきメソッドを実装 14・ 15・ 16・ 17- (void)setData:(NSArray *)data { 18 //データを更新 19 _data = data; 20 21 //self.tableViewに更新データを反映 22 [self.tableView reloadData];//・・・⑴ 23}
⑴を呼び出した時にデータを反映させる為には、dataSourceのメソッドで要素数やcell内容の記述の際にdataの配列を持つインスタンス変数self.dataのプロパティcountや要素を渡してください。
lang
1 2//ThirdView.m 3- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 4 return self.data.count; 5} 6 7- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 8 ・ 9 ・ 10 cell.textLabel.text = self.data[indexPath.row]; 11 ・ 12 ・ 13} 14
viewControllerの方では、上記で設計したThirdViewのインスタンス変数をthirdViewとした時、
lang
1//ViewController.m 2- (void)changeValue:(UISegmentedControl *)sender { 3 //ここにtableViewの内容を更新する処理を記述 4 self.thirdView.data = 更新するデータの配列; 5 6 //更新するデータ配列の種類がいくつかある場合、sender.tagをうまく使うといいでしょう 7} 8
投稿2015/04/01 08:14
編集2015/04/01 08:25総合スコア202
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/03 12:09
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/06 13:53