0

私はiOSとObjective-Cが初めてです。テーブルビューを表示するアプリケーションがあり、ユーザーが行をクリックすると新しいビューが開きます。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {  
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    DetailViewController *detailController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
    [detailController changeSubjectText:[subject_data_Array objectAtIndex:indexPath.row]];

    //navigationController = [[UINavigationController alloc] initWithRootViewController:detailController];

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [self.window addSubview:navigationController.view];
    [self.window makeKeyAndVisible];
}

私の詳細ビューでは、次のようにコーディングしました。

-(IBAction)closeDetail:(id)sender {
    NSLog(@"closeDetail");
    [self.view removeFromSuperview];
}

しかし、それは機能していません。誰でも助けることができますか?


誰でも私を助けることができますか?

どうすればビューを閉じることができますか?

私のコードをダウンロードしてください --> http://www.vasuta.com/ios/multiview2.zip

ビルドを開いて実行 「掲示板」の DetailView の 1 行をクリック 開いている 閉じるをクリック …..

DetailView が全画面表示にならず、詳細ビューを閉じることができないのはなぜですか?

間違って開いたり、間違って閉じたりします

お願い助けて

「GadgetBulletinsTVContoller.m」で確認できる didSelectRowAtIndexPath と、「DetailViewController.m」で確認できる close コマンド

どうもありがとうございました

ps。私の英語力でごめんなさい:(

4

2 に答える 2

3

なぜそのウィンドウ オブジェクトを作成し、サブビューを追加しようとしているのか? サブビューを追加したい場合は、それを親、テーブルビュー、またはテーブルビューの親に追加する必要があります。

より良いアイデアは、表示したい情報を表示する新しい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 アイテムの詳細がプッシュされます。詳細を表示する他のコントローラーについても同じ手順を実行する必要があります。

于 2012-05-10T09:38:25.473 に答える
-1

ウィンドウからビューを削除する代わりに、次を使用してすべてのテーブル ビューを含む基本ビューをリロードするだけです。self.window.rootviewcontroller

編集

私はappDelegateを作成することで解決策を得ました。あなたがしなければならないことは、以下に説明されています

ここに AppDelegate の最初の .h および .m ファイル (MultipleAppDelegate)

.h に追加

@property (strong, nonatomic) id<UIApplicationDelegate>delegate;

in .m 追加

@synthesize delegate;

説明したように、detailView を追加したい場所に .h および .m ファイルに以下を追加するだけです

ここの .h ファイル (GadgetBulletinsTVContoller)

#import "MultipleAppDelegate.h"

そしてインターフェースでは、このような1つの変数

MultipleAppDelegate *Mydelegate;

.m ファイル内viewDidLoadまたはloadViewメソッド内

Mydelegate = [[UIApplication sharedApplication]delegate];

次に、detailView の読み込み時にこれを行います

navigationController = [[UINavigationController alloc] initWithRootViewController:detailController];
Mydelegate.window.rootViewController = navigationController;
[Mydelegate.window makeKeyAndVisible];

.h ファイル内の detailViewController の .h および .m ファイル

#import "MultipleAppDelegate.h"

そしてインターフェースで

MultipleAppDelegate *appDelegate;

.m ファイル内viewDidLoadまたはloadViewメソッド内

appDelegate = [[UIApplication sharedApplication]delegate];

そして閉じるボタンをクリックすると

//Not required
//[self.navigationController popViewControllerAnimated:NO];
appDelegate.viewController = [[MultipleViewController alloc] initWithNibName:@"MultipleViewController" bundle:nil];
appDelegate.window.rootViewController = appDelegate.viewController;
[appDelegate.window makeKeyAndVisible];

これだけで問題なく動作します。問題は、移動して multipalViewController を表示するのに 1 ~ 2 秒かかることです。

コーディングを楽しんでください:)ハッピーコーディング:)

于 2012-05-10T10:15:49.120 に答える