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

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

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

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

iOS

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

Xcode

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

Swift

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

Q&A

解決済

4回答

7015閲覧

UIViewの中にUITableViewをいれる方法をおしえてください

yoppy0066

総合スコア293

Objective-C

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

iOS

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

Xcode

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

Swift

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

0グッド

2クリップ

投稿2015/03/30 10:33

初めて投稿させていただきます
やりたいこととしましては、少々複雑なページ構成で以下のようになっています

  1. UIView(ラベルや画像などを含む)
  2. UIView(SegmentedControllを含む)
  3. UIView(UITableViewを含む)
  4. UIView(ラベルやボタンを含む)

2.のSegumentedControllを切り替えると3.のUITableViewの内容を切り替えるようにしたいのですが、TableViewCellの内容がだいぶ違うため、このような構成にしてみました。

3.のUIViewはxibで別ファイルで作って、SegmentedControllをきりかえるたびに3.の読み込みView切替りえたいと考えているのですが、こういうやり方は可能なのでしょうか?UIViewの中にUITableViewをいれた場合、delegateとかはUIViewの中に書くことは可能なのでしょうか?

はじめてのiosアプリ開発になるので、そもそもこういうやり方が正しいかわからないし、文章もわかりづらくなってしまったのですが、ご回答いただけますと幸いです

よろしくおねがいします

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

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

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

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

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

guest

回答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
at1994

総合スコア202

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

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

yoppy0066

2015/04/06 13:53

ご丁寧に回答していただいてありがとうございます!解決しました!
guest

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
at1994

総合スコア202

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

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

yoppy0066

2015/04/06 10:48

ありがとうございます。 ソースコードでUITableViewを作って、addSubViewで貼り付けるとうまくいくのですが、 xibに配置したtableViewをソースへIBOutlet接続するとうまくうごかくて、、、 正しくやれば動くはずなのでしょうか?
guest

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
at1994

総合スコア202

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

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

yoppy0066

2015/04/06 07:29

度々ありがとうございます。 エラーはでなくなりました。がデリゲートの記述をいれてみたのですが、 今度はnumberOfRowsInSectionとcellForRowAtIndexPathが両方呼ばれず途方にくれています、、、 self.tableView?.delegate = self self.tableView?.dataSorce = self の記述を外して、Files's ownerにつなぐやり方でやるとエラーになるのでここが原因なのかとは思いますが、、、
guest

0

配置場所はわかりませんがこんなイメージでしょうか。
![イメージ説明]WIDTH:304
②を切り替え、③の要素を更新する操作は可能です。

UISegmentedControlはカスタマイズしないのであれば、UISegmentedControlクラスをそのまま使用し、UIViewControllerに貼り付けすればいいと思います。
②が切り替えられた時に呼ばれるメソッドを指定し、そのメソッド内で③の要素を更新する処理を実装します。

lang

1ViewController.m 2//viewDidLoadなど 3- (void)viewDidLoad { 456 //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]; 121314} 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の実装すべきメソッドを実装 14151617- (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 { 8910 cell.textLabel.text = self.data[indexPath.row]; 111213} 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
at1994

総合スコア202

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

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

yoppy0066

2015/04/03 12:09

ありがとうございます uiviewの初期化時に以下みたいにやったのですが、親に実装すべきメソッドがないエラーがでるのですが、この場合のselfは親になってしまうのでしょうか? class HogeView: UIView, UITableViewDelegate, UITableViewDataSource { override init() { super.init() self.initCustom() } override init(frame: CGRect) { super.init(frame: frame) self.initCustom() } required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.initCustom() } func initCustom() { println("initCustom") myTable?.delegate = self myTable?.dataSource = self }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問