Storyboardから始めるiPhoneアプリ開発

Twitterボタン
Twitterブログパーツ

Xcodeやobjective-c、Storyboardについて得た知識などiPhoneアプリ開発の体験記を配信


草刈りパニック 海軍王アカデミー シンプルゆめ日記 シンプル表計算CelLion 魔球スラッガー 地頭を鍛えるでんしゃ算数 Don't 100
2012/02/24(金)

[Xcode][objective-c]コードで画面遷移する方法@UITableView

カテゴリ:画面遷移
==<<管理者環境>>==
MacOSX ver.10.7.2
Xcode ver.4.2.1
iOSシミュレータ ver.5.0
==============


画面遷移を、Storyboard上でSegueを直接繋ぐのではなく、コードで実装する方法です。
(私のようにStoryboardが導入されたXcode4.2以降にiPhoneアプリ開発デビューした方は、ここでつまづくハズ…)

今回は、UITableViewのCellをタップして画面遷移(NavigationView付き)する方法を紹介します
(コードで画面遷移する方法については、こちらの記事もご覧ください。コードで画面遷移する方法@UIAlertView)
▲記事が長いので2つに分割しました(2012/3/1追記

下画像のように、ナビゲーションバー付きのUITableView(Navi1)にデータを表示して、タップしたセルに応じてそれぞれの詳細画面に遷移する方法を紹介します。

navi_seni


※注意
遷移画面をNavi1と表記します
遷移画面をNavi2と表記します

手順1 Storyboardを開き、UINavigationController(初期画面のUIViewController付き)を配置する
1スクリーンショット 2012-02-24 2.50.40

手順2 RootViewController(タイトルを「Navi1」に変更済み)にUITableViewを配置する
2スクリーンショット 2012-02-24 2.50.40


手順3 Navi1のUITableViewを選択し、以下3つをアウトレットする
(1)「ConnectionsInspector」の「Outlets」項目にある「datasource」
(2)「ConnectionsInspector」の「Outlets」項目にある「delegate」
(3)「ConnectionsInspector」の「ReferencingOutlets」項目にある「NewReferencingOutlet」
3スクリーンショット 2012-02-24 2.50.40「ReferencingOutlets」の時のみ下画像のように「view」という文字が出てくる。クリックする。99スクリーンショット 2012-02-24 2.50.40

下画像のようになればOK
99_2スクリーンショット 2012-02-24 2.50.40


手順4 Navi1のUITableViewのセルを選択し、「AttributesInspector」の「TableViewCell」項目にある「Identifier」に「Cell」と入力する

99_3スクリーンショット 2012-02-24 2.50.40


手順5 遷移先画面として、UITabelViewController(Navi2)を配置
888スクリーンショット 2012-02-24 5.08.43

手順6 Navi2に対して、手順2〜4を行う
(今回は、手順2の「タイトル変更」は不要)
6_2スクリーンショット 2012-02-24 2.50.40

手順7 Navi2の「AttributesInspector」の「ViewController」項目にある「Identifier」に任意な名前(他と被らないように)を設定する(今回の例では「detail」としました)

98スクリーンショット 2012-02-24 2.50.40


手順8 Navi1と2にそれぞれのテーブルにデータを表示するためのクラス(UITableViewControllerクラス)を設定する。
※今回の例では、Navi1用に「TestNavi1」クラス、Navi2用に「TestNavi2」クラスを用意しました。
※UITableViewControllerクラスの作成方法はコチラの記事(クラスファイルの作成方法)を参照のこと
777スクリーンショット 2012-02-24 4.55.00

手順9 Navi1のヘッダファイルにNavi2のヘッダファイルをインポートする
#import "TestNavi2.h"
@interface TestNavi1 : UITableViewController
@end


手順10 Navi1のメソッドファイルに、データ表示と画面遷移のためのコードを記述する
#import "TestNavi1.h"

@implementation TestNavi1
{
NSArray *myArray;//セル表示用配列
}

- (void)viewDidLoad
{
//セルに表示するテキストを配列に格納
myArray = [NSArray arrayWithObjects:@"カテゴリ1",@"カテゴリ2",@"カテゴリ3",nil];
}

//セルの数を返す
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//配列の要素数だけセルを設定
return [myArray count];
}

//セルの内容の設定
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

// セルに表示する文字を設定
cell.textLabel.text = [myArray objectAtIndex:indexPath.row];

return cell;
}

//画面遷移
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//セル選択状態の解除
[tableView deselectRowAtIndexPath:indexPath animated:YES];

//遷移先(Navi2)クラスのインスタンスを生成
TestNavi2 *testNavi2 = [self.storyboard instantiateViewControllerWithIdentifier:@"detail"];//手順7で付けた名前

//遷移先(Navi2)のタイトル(タップされたセルのテキストとした)の設定
testNavi2.title = [myArray objectAtIndex:indexPath.row];

[[self navigationController] pushViewController:testNavi2 animated:YES];
}

@end


手順11 Navi2のメソッドファイルにデータ表示のためのコードを記述する
#import "TestNavi2.h"

@implementation TestNavi2

// セルの数を返す
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//今回は適当に5つとした
return 5;
}

// セルの内容の設定
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

// セルに表示する文字を設定
cell.textLabel.text = [NSString stringWithFormat:@"%@ - %d", self.title, indexPath.row+1];

return cell;
}

@end


長くなりましたが以上です。うまく表示されましたでしょうか。
詳細画面から元の画面に戻るには、自動生成された「Navi1」ボタンを押すだけでOKです。

今回は、テーブルの中身を直書きで指定しましたが、実際のアプリはDBからデータを抽出するなど
「可変」での実装になると思います。余裕があればそのあたりも書こうかと思います。

コードで画面遷移する方法については、こちらの記事(コードで画面遷移する方法@UIAlertView)もご覧ください。
関連記事
  1. 2012/02/24(金)|
  2. 画面遷移
  3. | トラックバック:0
  4. | コメント:24
<<iPhoneアプリ『空手チョップ』 | ホーム | [Xcode][objective-c]コードで画面遷移する方法@UIAlertView>>

コメント

カテゴリ毎にセクション数を設定する方法

セル数ではなくセクション数の設定方法です。

手順1.遷移元から遷移先へセクション数の値渡し
※「viewcontroller 値渡し」で調べてみて下さい

手順2.遷移先でセクション数設定メソッドを実装(渡されて来た値をメソッド内でreturnする)
※下記URL記事の「//セクション数」というメソッドを参考にして下さい。
http://hhageru.blog.fc2.com/blog-entry-121.html
※メソッドについては「UITableViewデリゲートメソッド」で調べてみて下さい。


といった感じでしょうか。
手順1にて、タップしたセルに応じて渡す値を変えれば、カテゴリ1〜3それぞれセクション数を変える事が出来ます。
  1. 2012/07/06(金) 20:06:01 |
  2. URL |
  3. Casual App Team #-
  4. [ 編集 ]

こんにちは。

先日はありがとうございました。
お世話になっております。
もし、仮にOKであればなのですが以下のようなアプリの
チュートリアルを作って頂ければと思いますが、、、。

UITable View(テーブルビュー)の「セクションと行」、「画面遷移」に関してです。
複数のセクションの中に複数の行を入れ、どれか1つをタップ
すると画面遷移先で選択した行の名前が1段目に表示され、2段目のText Viewに
その説明文が入るようなアプリです。

例えば、「観光案内アプリとして」
****************************************
北海道
****************************************
札幌
小樽
室蘭
函館
阿寒湖
****************************************
京都
****************************************
金閣寺
清水寺
銀閣寺
二条城
映画村
****************************************
沖縄
****************************************
国際通り
美ら海水族館
石垣
宜野湾
****************************************
上記のようなテーブルビューを構成して、「金閣寺」を
タップすると
****************************************

金閣寺

京都市北区にある臨済宗相国寺派の寺。
舎利殿「金閣」が有名なため金閣寺
(きんかくじ)と通称される、相国寺の
山外塔頭寺院である[1]。


****************************************
のようなアプリなのですが、作りたいなと思っているのでこちらの
サイトでチュートリアルを公開して頂ければ幸いです。
いかがでしょうか?!
  1. 2012/09/03(月) 13:53:29 |
  2. URL |
  3. ニコラス #vXeIqmFk
  4. [ 編集 ]

>ニコラスさん

>ニコラスさん

こんばんは。いつも見て頂きありがとうございます。
チュートリアル作成リクエストの件ですが、ごめんなさい。
今はあまり時間的余裕が無いので無理です。

しかし、今回ニコラスさんがやりたいと思っていること(> UITable View(テーブルビュー)の「セクションと行」、「画面遷移」に関して)は、以下の当ブログ記事でほとんど実現出来ます。眺めてみて下さい。
▼設定画面の作り方(1)
http://hhageru.blog.fc2.com/blog-entry-119.html


ニコラスさんがやりたい項目に該当する記事内目印を記載しておきます。
※以下はすべて、設定画面の作り方(3)の記事内のコードです。
http://hhageru.blog.fc2.com/blog-entry-121.html
============================
> 複数のセクションの中に複数の行を入れ、
[目印]
ConfigListVC.m
//セクション数
//セクションタイトル
// セル数(実装必須)
// セル内容(実装必須)


> どれか1つをタップ
[目印]
ConfigListVC.m
//セルタップ


> すると画面遷移先で選択した行の名前が1段目に表示され、
[目印]
ConfigDetailVC.m
//設定リスト画面から渡されて来た文字列をタイトルに設定


> 2段目のText Viewにその説明文が入るようなアプリです。
この項目だけは記事中で触れていない内容です。
とは言っても簡単です。遷移元画面から渡されて来た値(記事で言えば「ジョブ」、ニコラスさんの例で言えば「金閣寺」など)をキーにしてその観光スポットの説明分をDBから抽出し、UITextViewにぶち込めば良いだけです。
============================

参考になれば。
記事内で個別に分からないことがあればその記事にコメント下されば、分かる範囲でお答えします。
それでは。
  1. 2012/09/03(月) 21:49:08 |
  2. URL |
  3. Casual App Team #-
  4. [ 編集 ]

おはようございます。

いつもお世話になっております。
ただ今、貴殿からの返信確認致しました。
本当にありがとうございます。
まだチャレンジしてみてはいないのですが、
本当に助かります。
セルが1つの際は上手く画面遷移が出来るん
ですが、複数になった途端に上手くいかなくて
辛くなっていました。
近日、コメントを参考にしてチャレンジしてみたい
と思います。
今後ともよろしくお願いします。
  1. 2012/09/06(木) 07:49:43 |
  2. URL |
  3. ニコラス #f9lQ/otg
  4. [ 編集 ]

こんばんは。
猛暑も少しずつおさまりつつありますね!
少々、落ち着いてきまして上記を取り組もうとしている
次第でございます。

恐縮でございますが、貴殿からご返信を頂きました上記の
「遷移元画面から渡されて来た値(記事で言えば「ジョブ」、
ニコラスさんの例で言えば「金閣寺」など)をキーにして
その観光スポットの説明分をDBから抽出し、UITextViewに
ぶち込めば」とございますが、「DB」とは何の事でしょうか?!
すみませんが、ご返答お願い申し上げます。

追記:1つセクションで複数行の場合は画面遷移先での
「タイトル名」と「説明文」の表示が出来るのですが、
セクション数が複数になった途端、出来なくなるんです!
悲しい事です。。。
  1. 2012/09/19(水) 21:17:29 |
  2. URL |
  3. ニコラス #ZTUiAoLM
  4. [ 編集 ]

>ニコラスさん

>ニコラスさん
こんばんは。

> 「DB」とは何の事でしょうか?!
DataBase:データベースの事です
そのご様子だとDBは使用されていない様なので、気にしないで下さい。

> 追記:1つセクションで複数行の場合は画面遷移先での
> 「タイトル名」と「説明文」の表示が出来るのですが、
> セクション数が複数になった途端、出来なくなるんです!
> 悲しい事です。。。
不具合の原因が判別できないので2点確認させてください。
Q1.画面遷移「元」では、セクションやセル共に想定通り表示出来ているんでしょうか。

Q2.セルをタップした時にどのような挙動になるのでしょうか。
挙動例)
*どのセルをタップしてもエラーが出て落ちる
*セクション1のセルは想定通りだが、セクション2のセルは落ちる
*セクション1のセルは想定通りだが、セクション2の第1セルをタップすると、遷移先でセクション1の第1セルの内容が表示される

以上です。ではまた。
  1. 2012/09/20(木) 00:39:11 |
  2. URL |
  3. Casual App Team #-
  4. [ 編集 ]

こんにちは。
お世話になっております。
本当にありがとうございます。
まずは、貴殿からのQにご返答致したいと思います。


Q1:画面遷移の元の画面(table view)の階層の画面はきちんと表示されております。

Q2:「セクション1のセルは想定通りだが、セクション2の第1セルをタップすると、
遷移先でセクション1の第1セルの内容が表示される」 とございますが、まさにこちらで
ございます。
以下のコードの場合ですと、セクション1の第1セルをタップすると、遷移先でセクション2の
第1セルの内容が表示されてしまいます。



長くなりますが、「MasterViewController.m」のコードを以下に表示したいと思います。
※以下の例ですと、

<table view>
++++++++++++++
アルコール飲料
++++++++++++++
ビール
ウィスキー
日本酒
ワイン

++++++++++++++
お茶
++++++++++++++
抹茶
緑茶
紅茶
ほうじ茶
++++++++++++++


<画面遷移先>
++++++++++++++
ビール

爽快感抜群

++++++++++++++
のように表示したいと思っております。


*******************************************************************************
<MasterViewController.m>
#import "mdMasterViewController.h"
#import "mdDetailViewController.h"

@interface mdMasterViewController () {
NSMutableArray *_objects;
}
@end

@implementation mdMasterViewController


- (void)awakeFromNib
{
[super awakeFromNib];
}

- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"飲み物";
myData = [[NSArray alloc] initWithObjects:
@"ビール",@"ウィスキー",@"日本酒",@"ワイン",nil];
myData2 = [[NSArray alloc] initWithObjects:
@"爽快感抜群",@"大人なモノ",@"お刺身とよく合う",@"赤と白、ロゼがメイン",nil];

myData00 = [[NSArray alloc] initWithObjects:
@"抹茶",@"緑茶",@"紅茶",@"ほうじ茶",nil];
myData02 = [[NSArray alloc] initWithObjects:
@"和菓子と合う",@"眠気覚ましにいい",@"午後に飲むのが良いらしい",@"食事に合う",nil];

// Do any additional setup after loading the view, typically from a nib.
self.navigationItem.leftBarButtonItem = self.editButtonItem;

UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];
self.navigationItem.rightBarButtonItem = addButton;
}

- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (void)insertNewObject:(id)sender
{
if (!_objects) {
_objects = [[NSMutableArray alloc] init];
}
[_objects insertObject:[NSDate date] atIndex:0];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}

#pragma mark - Table View

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section == 0) {
return myData.count;
}else {
return myData00.count;
}


}


-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
if (section == 0) {
return @"アルコール飲料";
} else {
return @"お茶";
}
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"myCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
cell= [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}


cell.textLabel.text = [myData objectAtIndex:indexPath.row];
cell.textLabel.text = [myData00 objectAtIndex:indexPath.row];


if (indexPath.section == 0) {
cell.textLabel.text = [myData objectAtIndex:indexPath.row];
}else {
cell.textLabel.text = [myData00 objectAtIndex:indexPath.row];
}
return cell;
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
// Return NO if you do not want the specified item to be editable.
return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
[_objects removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
} else if (editingStyle == UITableViewCellEditingStyleInsert) {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
}
}

/*
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
}
*/

/*
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
// Return NO if you do not want the item to be re-orderable.
return YES;
}
*/

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"mySegue"]) {
mdDetailViewController *viewController = [segue destinationViewController];
NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];

viewController.myStr = [myData objectAtIndex:selectedIndex];
viewController.myStr2 = [myData2 objectAtIndex:selectedIndex];
viewController.myStr00 = [myData00 objectAtIndex:selectedIndex];
viewController.myStr02 = [myData02 objectAtIndex:selectedIndex];
}
}
@end
******************************************************************************


******************************************************************************
<DetailViewController.m>

#import "mdDetailViewController.h"

@interface mdDetailViewController ()
- (void)configureView;
@end

@implementation mdDetailViewController
@synthesize myStr;
@synthesize myStr2;
@synthesize myStr00;
@synthesize myStr02;

@synthesize myLabel = _myLabel;
@synthesize myDetailLabel = _myDetailLabel;
@synthesize detailItem = _detailItem;
@synthesize detailDescriptionLabel = _detailDescriptionLabel;

#pragma mark - Managing the detail item

- (void)setDetailItem:(id)newDetailItem
{
if (_detailItem != newDetailItem) {
_detailItem = newDetailItem;

// Update the view.
[self configureView];
}
}

- (void)configureView
{
// Update the user interface for the detail item.

if (self.detailItem) {
self.detailDescriptionLabel.text = [self.detailItem description];
}
}

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self configureView];
self.myLabel.text =myStr;
self.myDetailLabel.text =myStr2;
self.myLabel.text =myStr00;
self.myDetailLabel.text =myStr02;
}

- (void)viewDidUnload
{
[self setMyLabel:nil];
[self setMyDetailLabel:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
self.detailDescriptionLabel = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end
******************************************************************************

コードまで貼付けて本当に恐れ入ります。
恐縮ですが、どこをどのように変更したらいいのでしょうか?!
とても困っております。
  1. 2012/09/20(木) 18:03:40 |
  2. URL |
  3. ニコラス #XyLnygWw
  4. [ 編集 ]

>ニコラスさん

>ニコラスさん
こんばんは。

コード全部は見ていませんがざっと見た感じで…
※訳が分からなくなったときの為に、修正作業をする前にプロジェクトごとバックアップを取って下さいね。プロジェクトフォルダをコピペすればOK

***************
原因
***************
>セクション1の第1セルをタップすると、遷移先でセクション2の第1セルの内容が表示されてしまいます。
原因は[DetailViewController.m]の[- (void)viewDidLoad]メソッド内の以下コードです。
ニコラスさんのコードの意味を右側に書きます

self.myLabel.text =myStr; //名前ラベルに「アルコール飲料」の名前(「ビール」や「ワイン」等)をセット
self.myDetailLabel.text =myStr2; //説明ラベルに「アルコール飲料」の説明(「爽快感抜群」や「赤と白、ロゼがメイン」等)をセット
self.myLabel.text =myStr00; //名前ラベルに「お茶」の名前(「緑茶」や「ほうじ茶」等)をセット
self.myDetailLabel.text =myStr02; //説明ラベルに「お茶」の説明(「眠気覚ましにいい」や「食事に合う」等)をセット

もうお気づきかと思います。コードは基本的に上から順に流れていきますので、セクション1のセルをタップしようがセクション2のセルをタップしようが、セクション1の内容(アルコール飲料)がセクション2の内容(お茶)で上書きされてしまいます。

具体的に言うと、

self.myLabel.text =myStr;//セクション1名前
↑これが↓これによって上書き
self.myLabel.text =myStr00;//セクション2名前

self.myDetailLabel.text =myStr2;//セクション1説明
↑これが↓これによって上書き
self.myDetailLabel.text =myStr02;//セクション2説明


***************
ちょっとアドバイス
***************
■遷移先(データを受け取る側)について
<現状>(viewDidLoadにて)
セクション1,2の名前用、説明用の変数をそれぞれ用意(セクション数×2個)
動作1.渡されて来たセクション1の名前をラベルにセット
動作2.渡されて来たセクション1の説明をラベルにセット
動作3.渡されて来たセクション2の名前をラベルにセット
動作4.渡されて来たセクション2の説明をラベルにセット
→セクションの数だけコードが増える
→汎用的でない

<理想>
名前用、説明用の変数を1つずつ用意(計2個だけ)
動作1.渡されて来たセクションの名前をラベルにセット
動作2.渡されて来たセクションの説明をラベルにセット
→セクションがいくつあろうと2行で済む

以上を踏まえて下記[対処]を読んでみて下さい


***************
対処
***************
<今やろうとしている事>
1.タップしたセルのセクションに応じて遷移先に渡す値(名前と説明)を変える
2.遷移元から渡されて来た名前と説明を各ラベルにセットする

▼以下、DetailViewControllerの修正
手順1.名前用・説明用変数を1つずつにする
※具体的にはmyStrとmyStr2だけでok

手順2.ラベルセットコードの蛇足部分を削除する
※具体的にはviewDidLoad内の以下2行を削除
self.myLabel.text =myStr00;
self.myDetailLabel.text =myStr02;

▼以下、MasterViewControllerの- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)senderの中身を以下のように修正
※ブログのコメント欄で手打ちしているのでコンパイルすら通していませんがご了承下さい。

修正前:
===========================================================
if ([[segue identifier] isEqualToString:@"mySegue"]) {
mdDetailViewController *viewController = [segue destinationViewController];
NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];

viewController.myStr = [myData objectAtIndex:selectedIndex];
viewController.myStr2 = [myData2 objectAtIndex:selectedIndex];
viewController.myStr00 = [myData00 objectAtIndex:selectedIndex];
viewController.myStr02 = [myData02 objectAtIndex:selectedIndex];
}
===========================================================

修正後:
===========================================================
if ([[segue identifier] isEqualToString:@"mySegue"]) {
mdDetailViewController *viewController = [segue destinationViewController];
NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];
NSInteger selectedIndexSec = [[self.tableView indexPathForSelectedRow] section]; //←追加

//タップしたセルのセクションに応じて遷移先に渡す値(名前と説明)を変える
switch (selectedIndexSec) {
case 0 //セクション1
viewController.myStr = [myData objectAtIndex:selectedIndex];
viewController.myStr2 = [myData2 objectAtIndex:selectedIndex];
break;
case 1 //セクション2
viewController.myStr = [myData00 objectAtIndex:selectedIndex];
viewController.myStr2 = [myData02 objectAtIndex:selectedIndex];
break;
}
}
===========================================================

以上です。コーディングミスでエラー出たらごめんなさい。
しかし、なぜ今回の現象が起きたのか、どうするべきなのかはお分かり頂けたと思います。
また、アドバイス項目で「汎用的にすべき」と書きました。上記修正コードの「//タップしたセルのセクションに応じて遷移先に渡す値(名前と説明)を変える」という部分も本来は汎用的にすべき箇所です。現状だと、セクションの数だけcase文が必要になってしまいますから。工夫してみて下さい。
それでは頑張って下さい
  1. 2012/09/20(木) 20:23:35 |
  2. URL |
  3. Casual App Team #-
  4. [ 編集 ]

こんにちは。
お世話になっております。
この度は本当に本当にありがとうございます。
たった今、貴殿のご助言の通りにやってみたところ
出来てしまいました。
感動している自分がいます。
出来なくて出来なくてずっと挫折してました。
ここが出来れば色々と幅が広がりそうです。
本当に助かりました。
そこで、また質問なのですが今回のような壁に
ぶちあたった時にはどのようにして解決していけば
いいのでしょうか?!
また、こちらの貴サイトですが誠に勝手ながら当方の
「NAVERまとめ」にてご紹介させて頂いております。
合わせて閲覧して頂けますと幸いです!
http://matome.naver.jp/odai/2134180951194817901

今後ともよろしくお願い申し上げます。
  1. 2012/09/22(土) 14:14:45 |
  2. URL |
  3. ニコラス #n5swYAmM
  4. [ 編集 ]

>ニコラスさん

>ニコラスさん
こんばんは

tableViewの件、解決したようで本当に良かったです。
理想のアプリが出来るといいですね。

また、貴サイト拝見させて頂きました。
当サイトを良く書いて頂きありがとうございます。
お役に立てたようで嬉しいです。


> そこで、また質問なのですが今回のような壁に
> ぶちあたった時にはどのようにして解決していけば
> いいのでしょうか?!
私が「通常」、問題解決の際にとっている手段は、

手段1.とりあえずXcode上でもがいてみる
- プロパティやメソッドのリストをほじくって考えてみる
※例えば…「self.」と打つと自動でselfのプロパティリストが表示されますよね

手段2.ググる
- 検索ワードでは出来るだけ正式名称を使う(例えばテーブルビューではなくUITableView)
 ※正式名称を使って情報公開をしているサイトが多いからです
- 国内サイトで見つからなければ海外サイト(「stackoverflow」という海外サイトで問題解決する確率は異常です※日本で言うと「教えてgoo」的なサイトです)

手段3.Appleのサンプルコードを探してみる
- tableViewとかalertViewとかscrollViewとかかなりお世話になりました
- なによりも「正しい実装方法」を「実際のコードを見ながら」知る事ができるのでこの手段を使わない手はありません
- ここで探せます↓
http://developer.apple.com/library/ios/navigation/

手段4.Appleリファレンスを読む
- プロパティやメソッドの仕様がわかります
- 「tableview reference」などで検索すると出てきます

手段1がかなり大事だったりします。
慣れてくると、ググることもなく自己解決する力がつきます。
プロパティやメソッドの種類や使い方を覚えてくると、未経験の新しい事をやろうとする時に応用が利いてWeb検索の時間が短くなりコーディングが早くなります。


冒頭に「通常」と書きましたが、今回ニコラスさんを襲った問題の解決に関しては上記手段では解決できない(あるいは解決手段発見までに非常に時間がかかる)と思います。
なぜなら、「エラー(想定通りいかない状態)の原因がわからないこと」が原因だと思うからです。
そしてさらにその原因は「各メソッドの役割やコードの流れを理解しきれていないこと」だと思います。
この手の問題は検索しても解決しにくいものです(と言うか、何を検索すれば良いか困りますよね笑)。

私の場合、例えばどこかのサイトからコードをコピペする時は、
1.どんなことをするコードなのか(極端に言えば悪意のあるコードが無いか)をざっとチェック。
2.プロジェクトを実行して理想の動きをするかチェック。
3.そしてデバッグで1行ごとのコードの「流れ」と「動作」をチェック(どのタイミングでどこの変数がどうなるのか等)
4.プロパティやメソッドの意味がわからなかったらその場で調べてブログ等に記録を残しておく

スーパーめんどくさいですけど、こうすることで技術が自分のモノになります。そして、エラー時に原因個所が見つけやすくなります。
それにより、アプリリリース後のバグ改修にも素早く対応出来ます。

私は今年から開発を始めた初心者ですが、今まで解決出来なかった問題はありません。自慢したいのではなくて解決できない問題なんてないと言う事です。
中には、問題を先送りし続けて解決まで半年掛かったこともありますが笑


…こんな感じでしょうか。回答になったかどうか分かりませんが参考にして頂けたら幸いです。
偉そうに長文ごめんなさい。
同じ開発者としてこれからもお互い頑張りましょう。
ではまた。
  1. 2012/09/22(土) 20:08:43 |
  2. URL |
  3. Casual App Team #-
  4. [ 編集 ]

こんにちは。

お世話になっております。
この度は本当にありがとうございました。
Xcodeとはトライ&エラーとの格闘ですね。
昨日、早速table viewの作製に取りかかったのですが、、、
現在停止中です。
まずは、ちょっと背伸びするくらいな感じでアプリの作製を
進めていきたいと思います。
今後もよろしくお願いします。
  1. 2012/09/24(月) 15:23:03 |
  2. URL |
  3. ニコラス #DJvhAyeU
  4. [ 編集 ]

おはようございます。

いつもお世話になっております。
おはようございます。
ささやかですが、こちらのサイト経由でアマゾンで書籍を
購入しました。
貴殿のアフィリエイトに微々たるものですがプラスになれば
幸いです。
  1. 2012/09/27(木) 08:29:16 |
  2. URL |
  3. ニコラス #f1tUsoV6
  4. [ 編集 ]

>ニコラスさん

>ニコラスさん
こんばんは。
お心遣いありがとうございました。
購入された書籍が参考になればと思います

> いつもお世話になっております。
> おはようございます。
> ささやかですが、こちらのサイト経由でアマゾンで書籍を
> 購入しました。
> 貴殿のアフィリエイトに微々たるものですがプラスになれば
> 幸いです。
  1. 2012/09/28(金) 00:25:50 |
  2. URL |
  3. Casual App Team #-
  4. [ 編集 ]

先日は、ありがとうございました。
テーブルビューを使ったアプリが数日前に
app storeにてリリースがOKになりました。
遅くなりましたが、報告致します。
app storeにて「日本国憲法」と検索して
みて下さい!
現時点では2番目に表示されます。
おかげさまでアプリが出来ました。
本当に先日はありがとうございました。
また、何かありましたらよろしくお願い
致します!!!
  1. 2012/10/25(木) 20:36:07 |
  2. URL |
  3. ニコラス #ezjp30iY
  4. [ 編集 ]

>ニコラスさん

ニコラスさんこんばんは

アプリリリースおめでとうございます
さっそく見させて頂きました
シンプルでいい仕上がりですね
たくさんダウンロードされることを祈っています

これからも頑張りましょう
  1. 2012/10/26(金) 20:04:45 |
  2. URL |
  3. Casual App Team #-
  4. [ 編集 ]

こんばんは。

ご返答、ありがとうございます。
おかげさまで数百のダウンロードを頂いております。
有料にすると競合のアプリがあるため0になります。
憲法は無料でいきたいと思います。
テーブルビューが使えた事で幅が広くなりました。
本当にありがとうございました。
ゲームアプリとかも出来れば良いのですが、こちらは
もう少々後になりそうです!
また何かありましたらよろしくお願いします。
  1. 2012/10/28(日) 19:28:31 |
  2. URL |
  3. ニコラス #K97lpksc
  4. [ 編集 ]

こんにちは。

いつもお世話になっております。
この度も質問があり投稿させて頂きます。
よろしくお願いします。

先日のような「日本国憲法」のアプリに上部か下部に
タブを追加する形で「検索」と「ブックマーク」の機能を
付けるためにはどのようにしたら良いのでしょうか?!
ご返答頂けますと幸いです。
お待ち致しております。

  1. 2012/11/10(土) 12:13:01 |
  2. URL |
  3. ニコラス #Oib0hDko
  4. [ 編集 ]

>ニコラスさん

こんばんは。

いつもありがとうございます。
せっかくのご質問ですが、当ブログは質問サイトではないので…
記事の内容についてでしたらもちろんお答えします。

宜しくお願い致します

> いつもお世話になっております。
> この度も質問があり投稿させて頂きます。
> よろしくお願いします。
>
> 先日のような「日本国憲法」のアプリに上部か下部に
> タブを追加する形で「検索」と「ブックマーク」の機能を
> 付けるためにはどのようにしたら良いのでしょうか?!
> ご返答頂けますと幸いです。
> お待ち致しております。
  1. 2012/11/10(土) 19:40:17 |
  2. URL |
  3. Casual App Team #-
  4. [ 編集 ]

おはようございます。

お世話になっております。
そうですね。おっしゃる通りです。。。
なんだか、失礼致しました。
おススメの書籍等もしありましたら教えて
頂けますか?!
入門編の次のステップで良い書籍がありましたら
ご教授頂ければ幸いです。
  1. 2012/11/13(火) 10:07:14 |
  2. URL |
  3. ニコラス #nbQWbvZk
  4. [ 編集 ]

>ニコラスさん

こんばんは。
おすすめ書籍ですか…特にありません笑
私自身書籍を一冊も読んでいないもので…

海外サイトも含めネットだけでなんとかなっています。
サーバーを使ったアプリなど大掛かりなものを作るときは、正しい知識をつけるために書籍なども必要かもしれませんね。

> お世話になっております。
> そうですね。おっしゃる通りです。。。
> なんだか、失礼致しました。
> おススメの書籍等もしありましたら教えて
> 頂けますか?!
> 入門編の次のステップで良い書籍がありましたら
> ご教授頂ければ幸いです。
  1. 2012/11/16(金) 19:13:03 |
  2. URL |
  3. Casual App Team #-
  4. [ 編集 ]

こんにちは。

お世話になっております。
コメント、ありがとうございます。
書籍を1冊も読んでないとは凄いですね。
感銘を受けます。
なんとか、頑張りたいと思います。
  1. 2012/11/18(日) 16:22:21 |
  2. URL |
  3. ニコラス #XRR3ijCs
  4. [ 編集 ]

広告実装について

制作途中のアプリに広告を実装させようと思います。

現在各ViewControllerに個別にコードを書いて実装することは出来るようになりました。
ただこの方法ですと、Viewが増えるたびにコードを実装しなければならいですし、Viewの数が多いと作業が煩雑になります。、またメモリリークの原因となるかと思います。

何かしらの方法で、アプリ内すべてのViewに広告を一括で実装出来る方法はないのでしょうか?
  1. 2013/01/11(金) 20:47:29 |
  2. URL |
  3. けんけんぱ #-
  4. [ 編集 ]

はじめまして。
table viewを使ったアプリのサンプルを探していた時に、このページを見つけて参考にさせて頂きました。
ただ、sampleコードをそのまま使っていたのに、エラーを吐く箇所がありました。

TestNavi2.mの中で
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
を実行した時に、cellがnilを返してきてエラーになってしまいます。

実行環境はios sdk6.1、xcode4.6です。
identifierについては、TestNavi2のViewの部分だけsampleと同様ではなく、storyboard IDをdetailに設定しています。

もしも解決方法がわかったら、教えていただけるとありがたいです。
  1. 2013/02/28(木) 05:02:30 |
  2. URL |
  3. ジャマイカ #9UrJBJ6Y
  4. [ 編集 ]

承認待ちコメント

このコメントは管理者の承認待ちです
  1. 2013/06/07(金) 12:10:54 |
  2. |
  3. #
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://blog.casualappteam.com/tb.php/55-d128460c
この記事にトラックバックする(FC2ブログユーザー)

検索フォーム

アプリ紹介記事

おすすめ書籍

入門者向けおすすめサービス

iPhoneアプリ開発やリリースに必須と思われるサービスです。開発と並行してリリースの環境を整える必要があります。

    シティバンク
    アプリから得られる収入やアプリ製作関連の支出を管理する口座が必要です。アプリから得られる収入は日本円だけではなく米ドル等の外貨の場合がありますので、グローバルで貨幣の両替が簡易な銀行口座を選択します。一旦はここで無難です。

    FC2ブログ
    アプリをリリースする際、サポートサイトが必須です。無料で使い勝手の良いFC2ブログがおすすめです。

    リンクシェア
    アプリの下によくある広告のあれです。ここと提携してアプリ内に広告を設置することで、広告収入を得ることができます。少しでも下心があるなら必須です。

    三井住友VISAカード
    デベロッパー登録やその他経費をクレジット払いにしておけば支払いの履歴も残りますし、一々振り込む手間が省けます。三井住友VISAカードならcitiバンクを支払い口座に指定できますし、なにかと便利です。

中級者向けおすすめサービス

iPhoneアプリをリリースしても、ダウンロードされなければ意味がありません。さらに集客力・発信力を向上させましょう。

    お名前.com
    格安で独自ドメインを取得することができます。自社サイト・個人サイトを作成する際にご利用ください。

    さくらのレンタルサーバ
    レンタルサーバーです。webサイト用もしくはアプリのデーターサーバー用にどうぞ。

    ロリポップ!レンタルサーバー
    レンタルサーバーです。webサイト用もしくはアプリのデーターサーバー用にどうぞ。

その他のおすすめサービス

私のオススメのサービスです。
参考なれば幸いです。


1位   リクナビNEXT

iPhoneアプリエンジニアは求人市場で需要があります。一般企業はアプリを広告として使うケースがありますから。私自身もリクナビNEXTを利用しています。


2位   随時更新していきます。

QRコード

QR

全記事表示リンク

全ての記事を表示する

カテゴリ

最新記事

月別アーカイブ

プロフィール

CasualAppTeam

Author:CasualAppTeam
初めまして。
iPhoneアプリ開発についてブログを綴っていきます。
xcodeやobjective-c,storyboardなどについて詳しく書いていきます。

最新コメント

最新トラックバック

RSSリンクの表示

自分のための外部リンク