xcode 在表格视图中点击单元格时推送新视图

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5571686/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 20:44:44  来源:igfitidea点击:

Push a new view when a cell is tapped in Table View

objective-cxcodeuitableviewdidselectrowatindexpath

提问by PatrickGamboa

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

嘿伙计们,我有一个填充了 21 个数据的表格视图:

- (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];
}

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 个元素都打开了我创建的同一个 nib 文件。基本上,我想为我的 21 个元素中的每一个创建 1 个 UIViewController,其中每个元素都有自己的元素描述,而不仅仅是对表视图中的所有元素使用 1 个 UIViewController,并且当每个元素被点击时,每个元素都会打开自己的看法。显然,我不知道如何在这部分编码,所以我希望有人能帮助我解决我的 iPhone 项目的这一部分,谢谢

回答by Mark Adams

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

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

Consider this...

考虑这个...

- (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];
}

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

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

EditYou'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:

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

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

    return glossaryDetailViewController;
}

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

如果你走这条路,你可以删除if语句,只需调用self.glossaryDetailViewController.