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

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

ただいまの
回答率

90.48%

  • Swift

    7455questions

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

  • Xcode

    4202questions

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

  • iOS

    4080questions

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

  • Objective-C

    1198questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 2
  • VIEW 3,827

yoppy0066

score 253

初めて投稿させていただきます
やりたいこととしましては、少々複雑なページ構成で以下のようになっています
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アプリ開発になるので、そもそもこういうやり方が正しいかわからないし、文章もわかりづらくなってしまったのですが、ご回答いただけますと幸いです

よろしくおねがいします
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

xibから読み込んだUIViewカスタムクラスを使用する場合は、delegateとdataSourceはFiles's Ownerに接続してはいけません。MyViewに接続しましょう。
![イメージ説明そしてUITableViewをMyViewにアウトレット接続する際は、ObjectをMyViewにしてください。

//
//  MyView.swift
//  Teratail
//
//  Created by ATSUSHI on 2015/04/06.
//  Copyright (c) 2015年 ATSUSHI. All rights reserved.
//

import UIKit

class MyView : UIView, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet var tableView: UITableView!
    
    var data : NSMutableArray = ["a","b","c","d"]
    
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    func setData(data : NSMutableArray) {
        self.data = data
        self.tableView.reloadData()
    }
    
    //クラスメソッド
    //xibから読み込み
    class func instance() -> MyView {
        return NSBundle.mainBundle().loadNibNamed("MyView", owner: self, options: nil).first as MyView
    }
    
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
        cell.textLabel?.text = self.data[indexPath.row] as? String
        
        return cell
    }
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.data.count
    }

}

//
//  ViewController.swift
//  Teratail
//
//  Created by ATSUSHI on 2015/04/06.
//  Copyright (c) 2015年 ATSUSHI. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        var view : MyView? = MyView.instance()
        self.view.addSubview(view!)       
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/06 22:53

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

    キャンセル

+2

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

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

ViewController.m
//viewDidLoadなど
- (void)viewDidLoad {
・
・
    //self.segmentedControlはUISegmentedControlのインスタンス変数
    //actionにSEL型でsegmentedControlが切り替えられた時に呼ばれるメソッドを指定します。
    self.segmentedControl addTarget:self
                             action:@selector(changeValue:)
                   forControlEvents:UIControlEventValueChanged];
    [self.view addSubView:self.segmentedControl];
・
・
}

- (void)changeValue:(UISegmentedControl *)sender {
    //ここにtableViewの内容を更新する処理を記述
}

③のUITableViewも特別カスタマイズしないのであればviewControllerに乗せればいいと思いますが
delegate、dataSourceは UIViewにも実装できます。
//ThirdView.h
#import <UIKit/UIKit.h>

@interface ThirdView : UIView <UITableViewDataSource, UITableViewDelegate>

@property (nonatomic, strong) UITableView* tableView;
@property (nonatomic, setter = setData:) NSArray* data;//可変ならNSMutableArray

@end

//ThirdView.m

//UITableViewDelegateとUITableViewDataSourceの実装すべきメソッドを実装
・
・
・
- (void)setData:(NSArray *)data {
    //データを更新
    _data = data;

    //self.tableViewに更新データを反映
    [self.tableView reloadData];//・・・⑴
}

⑴を呼び出した時にデータを反映させる為には、dataSourceのメソッドで要素数やcell内容の記述の際にdataの配列を持つインスタンス変数self.dataのプロパティcountや要素を渡してください。
//ThirdView.m
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.data.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ・
    ・
    cell.textLabel.text = self.data[indexPath.row];
    ・
    ・
}
viewControllerの方では、上記で設計したThirdViewのインスタンス変数をthirdViewとした時、
//ViewController.m
- (void)changeValue:(UISegmentedControl *)sender {
    //ここにtableViewの内容を更新する処理を記述
    self.thirdView.data = 更新するデータの配列;

    //更新するデータ配列の種類がいくつかある場合、sender.tagをうまく使うといいでしょう
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/03 21: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
    }

    キャンセル

+2

class MyView : UIView, UITableViewDelegate, UITableViewDataSource {

    var tableView : UITableView? = UITableView(frame: rect)
    var data : NSMutableArray = []
    
    override init() {
        super.init()
        self.setUp()
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.setUp()
    }
    
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.setUp()
    }
    
    func setData(data : NSMutableArray) {
        self.data = data
        self.tableView?.reloadData()
    }
    
    func setUp() {
        self.addSubview(self.tableView!)
        self.tableView?.delegate = self
    }
    
    //①
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
        
        cell.textLabel?.text = self.data[indexPath.row] as? String
        
        return cell
    }
    
    //②
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.data.count
    }

}

UITableViewDataSourceプロトコルを紐付けた時、実装すべきメソッドが2つあります。
その2つのメソッドを実装すればエラーが消えると思うので試してみてください。
ソースコード上の①と②のメソッドです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/06 16:29

    度々ありがとうございます。
    エラーはでなくなりました。がデリゲートの記述をいれてみたのですが、
    今度はnumberOfRowsInSectionとcellForRowAtIndexPathが両方呼ばれず途方にくれています、、、


    self.tableView?.delegate = self
    self.tableView?.dataSorce = self
    の記述を外して、Files's ownerにつなぐやり方でやるとエラーになるのでここが原因なのかとは思いますが、、、

    キャンセル

+2

self.tableView?.delegate = self
self.tableView?.dataSorce = self
この記述は入れておきましょう。
そしてnumberOfSectionsInTableViewは実装していますか?
*ちなみに実装していなくてもnumberOfRowsInSectionとcellForRowAtIndexPathは呼ばれるはずです。
yoppy0066さんがどのようにコードを記述しているか全貌はわかりませんが、UITableViewインスタンスは正しく生成していますか?
ちなみに僕の方ではどちらのメソッドも呼び出され、tableViewの表示確認ができました。

一応張っておきます。
//
//  MyView.swift
//  Teratail
//
//  Created by ATSUSHI on 2015/04/06.
//  Copyright (c) 2015年 ATSUSHI. All rights reserved.
//

import UIKit

class MyView : UIView, UITableViewDelegate, UITableViewDataSource {

    //動的にサイズ対応すべき
    var tableView : UITableView? = UITableView(frame: CGRectMake(0, 0, 375, 677));
    
    var data : NSMutableArray = ["a","b","c","d"]
    
    override init() {
        super.init()
        self.setUp()
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.setUp()
    }
    
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.setUp()
    }
    
    func setData(data : NSMutableArray) {
        self.data = data
        self.tableView?.reloadData()
    }
    
    func setUp() {
        self.addSubview(self.tableView!)
        self.tableView?.delegate = self
        self.tableView?.dataSource = self
    }
    
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
        cell.textLabel?.text = self.data[indexPath.row] as? String
        
        return cell
    }
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.data.count
    }

}

//
//  ViewController.swift
//  Teratail
//
//  Created by ATSUSHI on 2015/04/06.
//  Copyright (c) 2015年 ATSUSHI. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        //動的にサイズ対応すべき
        var view : MyView? = MyView(frame: CGRectMake(0, 0, 375, 677))
        self.view.addSubview(view!);
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/06 19:48

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

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Swift

    7455questions

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

  • Xcode

    4202questions

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

  • iOS

    4080questions

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

  • Objective-C

    1198questions

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