なぜそのウィンドウ オブジェクトを作成し、サブビューを追加しようとしているのか? サブビューを追加したい場合は、それを親、テーブルビュー、またはテーブルビューの親に追加する必要があります。
より良いアイデアは、表示したい情報を表示する新しいView Controllerをスタックにプッシュすることです。
これは、テーブルビューチュートリアル リンクでセルを選択するときに、新しいビュー コントローラーをプッシュする方法を示すチュートリアルです。
編集: MultipleAppDelegate で - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions は次のようになります。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[MultipleViewController alloc] initWithNibName:@"MultipleViewController" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
navController.navigationBarHidden = YES;
self.window.rootViewController = navController;
[self.window makeKeyAndVisible];
return YES;
}
GadgetBulletinsTVContoller.h で、次のようなプロトコルを宣言します。
@protocol GadgetBulletinsTVControllerDelegate <NSObject>
@optional
- (void)showItemDetails:(id)selectedItem;
@end
およびデリゲート プロパティ:
@property (nonatomic, assign)id<GadgetBulletinsTVControllerDelegate>delegate;
GadgetBulletinsTVContoller.m でデリゲートを合成します。- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath は次のようになります。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if([delegate respondsToSelector:@selector(showItemDetails:)])
{
[delegate showItemDetails:[subject_data_Array objectAtIndex:indexPath.row]];
}
}
FirstViewController.m で、コントローラーに次のように GadgetBulletinsTVControllerDelegate を実装するように指示します。
@interface FirstViewController ()<GadgetBulletinsTVControllerDelegate>
in viewDidLoad method tell the gadgetBulletinsController that his delegate is the FirstViewController class, like this:
if (gadgetBulletinsContoller == nil) {
gadgetBulletinsContoller = [[GadgetBulletinsTVContoller alloc] init];
gadgetBulletinsContoller.delegate = self;
}
GadgetBulletinsTVControllerDelegate のメソッドを実装します。
- (void)showItemDetails:(id)selectedItem
{
if([delegate respondsToSelector:@selector(showDetailsScreenForItem:)])
{
[delegate showDetailsScreenForItem:selectedItem];
}
}
FirstViewController.h で、以下のようなプロトコルを宣言します。
@protocol FirstViewControllerDelegate <NSObject>
- (void)showDetailsScreenForItem:(id)item;
@end
以下のようなデリゲート プロパティを宣言します (.m ファイルで合成することを忘れないでください)。
@property (nonatomic, assign)IBOutlet id<FirstViewControllerDelegate>delegate;
MultipleViewController.xib で FirstViewController 画面を選択し、アウトレットでデリゲートから fileOwner にドラッグして、デリゲートの値を MultipleViewController に設定します (必要に応じて、コードでこれを行うことができます)。
MultipleViewController.m で、以下のように FirstViewControllerDelegate プロトコルを実装するよう MultipleViewController に指示します。
@interface MultipleViewController ()<FirstViewControllerDelegate>
プロトコルメソッドを実装します。
- (void)showDetailsScreenForItem:(id)item
{
DetailViewController *detailController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
[detailController changeSubjectText:item];
[self.navigationController pushViewController:detailController animated:YES];
}
DetailViewController で、closeDetail メソッドを次のように変更します。
- (IBAction)closeDetail:(id)sender {
NSLog(@"closeDetail");
[self.navigationController popViewControllerAnimated:YES];
}
ほら、あなたの GadgetBulletinsTVController アイテムの詳細がプッシュされます。詳細を表示する他のコントローラーについても同じ手順を実行する必要があります。