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中的一行它已打开单击关闭......

为什么 DetailView 不是全屏的,为什么不能关闭详细视图?

我打开错误或关闭错误

请帮帮我

didSelectRowAtIndexPath 您可以在“GadgetBulletinsTVContoller.m”中看到,关闭命令您可以在“DetailViewController.m”中看到

非常感谢你

附言。对不起我的英语技能:(

4

2 回答 2

3

为什么要创建该窗口对象,为什么要尝试将子视图添加到其中?如果要添加子视图,则应将其添加到父视图、tableview 或 tableView 的父视图。

一个更好的主意是在堆栈上推送一个新的视图控制器,以显示您想要显示的信息。

这是一个教程,展示了如何在 tableview教程链接中选择单元格时推送新的视图控制器。

编辑:在 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 屏幕并在 outlets 中从委托拖动到 fileOwner 以将委托的值设置为 MultipleViewController(如果您愿意,可以在代码中执行此操作)。

在 MultipleViewController.m 中告诉 MultipleViewController 实现 FirstViewControllerDelegate 协议,如下所示:

@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 Here (MultipleAppDelegate) 的第一个 .h 和 .m 文件

在 .h 添加

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

在 .m 中添加

@synthesize delegate;

现在您想在哪里添加 detailView 只需按照说明在 .h 和 .m 文件中添加以下内容

在此处的 .h 文件中(GadgetBulletinsTVContoller)

#import "MultipleAppDelegate.h"

并在接口一个这样的变量

MultipleAppDelegate *Mydelegate;

在 .m 文件中viewDidLoadloadView方法中

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 文件中viewDidLoadloadView方法中

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 回答