在表格视图中点击单元格时推送新视图 [英] Push a new view when a cell is tapped in Table View

查看:68
本文介绍了在表格视图中点击单元格时推送新视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,我有一个填充了 21 个数据的表视图:

Hey guys, I have a Table View that has been populated with 21 data:

- (void)viewDidLoad {

        self.title = NSLocalizedString(@"Glossary", @"Back");

        NSMutableArray *array = [[NSArray alloc] initWithObjects:@"Title", @"Meta Description Tag", @"Meta Keywords", @"Headings", @"Images", @"Frames", @"Flash Contents", @"Charset", @"Favicon", @"W3C Compatibility", @"Page Rank", @"Alexa Rank", @"Indexed Pages", @"Latest Date Cached By Google", @"Backlinks", @"Dmoz Listing", @"Server Info", @"IP", @"Location", @"Server Type", @"Registrar Info", nil];
        self.glossaryArray = array;
        [array release];
    }


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        // Return the number of sections.
        return 4;
    }

    // Category
    - (NSString *)tableView:(UITableView *)tableView
    titleForHeaderInSection:(NSInteger)section
    {
        if (section == 0) return @"In-Site SEO";
        if (section == 1) return @"Inside Analysis";
        if (section == 2) return @"Ranks N Stuff";
        if (section == 3) return @"Server Info";
        return @"Other";
    }

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        // Return the number of rows in the section.
        if (section == 0) return 7;
        if (section == 1) return 3;
        if (section == 2) return 6;
        if (section == 3) return 5;
        return 0;
    }

    // Customize the appearance of table view cells.
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        static NSString *CellIdentifier = @"Cell";

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

        // Configure the cell...
        NSUInteger row = [indexPath row];
        if ( indexPath.section == 1 ) row += 7;
        if ( indexPath.section == 2 ) row += 10;
        if ( indexPath.section == 3 ) row += 16;
        if ( indexPath.section == 4 ) row += 21;
        cell.textLabel.text = [glossaryArray objectAtIndex:row];

        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

        return cell;
    }

Now this is the code I used to pussh a new view when a cell is tapped:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSInteger row = [indexPath row];
        if (self.glossaryDetailViewController == nil) {
            GlossaryDetailViewController *aGlossaryDetail = [[GlossaryDetailViewController alloc] initWithNibName:@"GlossaryDetailViewController" bundle:nil];
            self.glossaryDetailViewController = aGlossaryDetail;
            [aGlossaryDetail release];
        }

        glossaryDetailViewController.title = [NSString stringWithFormat:@"%@", [glossaryArray objectAtIndex:row]];

        NewReferencemoi_caAppDelegate *delegate = (NewReferencemoi_caAppDelegate *)[[UIApplication sharedApplication] delegate];
        [delegate.glossaryNavController pushViewController:glossaryDetailViewController animated:YES];
}

这段代码运行良好,但问题是我的表视图中的每一个和所有 21 个元素都打开了我创建的同一个 nib 文件.基本上,我想为我的 21 个元素中的每一个创建 1 个 UIViewController,其中每个元素都有自己的元素描述,而不仅仅是对表视图中的所有元素使用 1 个 UIViewController,并且当每个元素被点击时,每个元素都会打开自己的看法.显然,我不知道如何在这部分编码,所以我希望有人能帮助我解决我的 iPhone 项目的这一部分,谢谢

This code works perfectly, but the problem is that each and all 21 elements in my table view is opening the one and same nib file that I created. Basically, I want to create 1 UIViewController for each of my 21 elements, where each have their own description of the element, not just using 1 UIViewController for all elements in my Table View, and when each element has been tapped, each open their own view. Apparently, I don't know how to code in that part, so I hope someone can help me out with this part of my iPhone project, thanks

推荐答案

请不要为了显示不同的项目而创建 21 个不同的视图控制器.而是在 GlossaryDetailViewController 上设置一个属性来保存数据模型项的实例.

Please do not create 21 different view controllers just to show different items. Instead set a property on GlossaryDetailViewController that holds an instance of your data model item.

考虑一下...

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{    
    NSInteger row = [indexPath row];

    if (self.glossaryDetailViewController == nil)
    {
        GlossaryDetailViewController *aGlossaryDetail = [[GlossaryDetailViewController alloc] initWithNibName:@"GlossaryDetailViewController" bundle:nil];
        self.glossaryDetailViewController = aGlossaryDetail;
        [aGlossaryDetail release];
    }

    glossaryDetailViewController.glossaryDetailItem = [glossaryArray objectAtIndex:row];

    [self.navigationController pushViewController:self.glossaryDetailViewController animated:YES];
}

使用这种方法使 GlossaryDetailViewController 负责设置它自己的数据.

Using this approach makes GlossaryDetailViewController responsible for setting it's own data.

编辑您还会注意到我删除了对应用程序委托的引用.您不需要它来访问导航控制器.导航控制器堆栈中的每个视图控制器都有一个对它的引用.虽然我彻底撕毁了您的代码,但我还会通过覆盖 glossaryDetailViewController 的 getter 来考虑创建视图控制器,如下所示:

Edit You'll also notice that I removed references to the app delegate. You don't need it to get access to the navigation controller. Each view controller in a navigation controller stack has a reference to it. While I'm thoroughly tearing your code apart, I would also factor out the creation of the view controller by overriding the getter for glossaryDetailViewController, like this:

- (GlossaryDetailViewController *)glossaryDetailViewController
{
    if (!glossaryDetailViewController)
    {
        glossaryDetailViewController = [[GlossaryDetailViewController alloc] init];
    }

    return glossaryDetailViewController;
}

如果你走这条路,你可以去掉if语句,只调用self.glossaryDetailViewController.

If you go this route, you can remove the if statement and just call self.glossaryDetailViewController.

这篇关于在表格视图中点击单元格时推送新视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆