2

UITableViewがあり、その中に次の方法でカスタムUITableViewCellを作成します。

ItemCellController *cell = (ItemCellController *)[tableView dequeueReusableCellWithIdentifier:ContentListsCellIdentifier];
...
cell = [[[ItemCellController alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ContentListsCellIdentifier] autorelease];

これは、touchesBeganイベントとtouchesEndedイベントを取得できるようにするために行います(これにより、ロングタッチを実装できます)。NSLogを使用すると、次のコードを使用して、touchesBeganメソッド内からlongTouchが適切に呼び出されていることがわかります。

timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(longTouch:) userInfo:nil repeats:YES];

問題は、longTouchメソッド内からモーダルウィンドウを呼び出すことができないことです。

次のことを試しましたが、NSInvalidArgumentException-[ItemCellController NavigationController]:認識されないセレクターがインスタンスに送信されましたエラーが発生します。

AddItemController *addView = [[AddItemController alloc] initWithNibName:@"AddItemView" bundle:nil];  

UINavigationController *controller = [[UINavigationController alloc] initWithRootViewController:addView];
controller.navigationBar.barStyle = UIBarStyleBlack;
[[self navigationController] presentModalViewController:controller animated:YES];
[controller release];

したがって、問題は、カスタムUITableViewCell内からモーダルウィンドウを呼び出すにはどうすればよいかということです。

ありがとう

4

2 に答える 2

13

navigationControllerプロパティはsに存在しますが、UIViewControllerUITableViewCell私が推測するItemCellControllerのはのサブクラスです)はではないUIViewControllerため、デフォルトではそのプロパティはありません。

いくつかのアプローチがあります:

UIViewController*(1)カスタムセルタイプにプロパティ(おそらくそれを呼び出す)を追加controllerし、initメソッド(たとえば)を使用してコントローラーへのポインターを渡しますinitWithController:。次に、セルで次の操作を実行できます。

UINavigationController* navController = [ /* alloc and init it */ ]
[self.controller presentModalViewController:navController animated:YES];

(2)アプリデリゲートオブジェクトには、コード内のどこからでもアクセスできるコントローラープロパティが含まれている可能性があります。次に、次のようなことを行うことができます。

MyAppDelegate* myAppDelegate = [[UIApplication sharedApplication] delegate];
[myAppDelegate.controller presentModalViewController:navController
                                            animated:YES];

(3)これは直接的ではありませんが、より柔軟性があります。ルートコントローラー(モーダルビューの表示を実行するコントローラー)を設定して、特定の通知をリッスンし、テーブルセル内からその通知を投稿することができます。

ルートコントローラー内から呼び出されるサンプルのリッスンコード:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(showModal:)
                                             name:@"show modal"
                                           object:nil];

テーブルセル内から呼び出されるサンプルの郵便番号:

NSDictionary* userInfo = [ /* store a handle to your modal controller */ ];
[[NSNotificationCenter defaultCenter] postNotificationName:@"show modal"
                                                    object:self
                                                  userInfo:userInfo];

また、showModal:ルートコントローラーのメソッドは、にuserInfo含まれているものを使用して、NSNotificationモーダルに提示するビューコントローラーを特定します。それはもっと手間がかかりますが、ルートコントローラーポインターへのフルアクセスを与えることなく、どこにいてもコードがモーダルビューを表示できるようになります。

于 2009-08-12T18:30:41.120 に答える
0

セルナビゲーションコントローラーをどこにも設定していないように見えますが、好きではないようです [[self navigationController] presentModalViewController:controller animation:YES]; その行で、その「自己」オブジェクトの nagivController プロパティを確認します

于 2009-08-12T18:10:49.523 に答える