Выдвиньте новое представление, когда ячейка коснулась в табличном представлении - PullRequest
1 голос
/ 06 апреля 2011

Привет, ребята, у меня есть табличное представление, в котором есть 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];
}

Этот код работает отлично, но проблема в том, что все 21 элемент в моем табличном представлении открываетодин и тот же файл пера, который я создал.По сути, я хочу создать 1 UIViewController для каждого из моих 21 элемента, где у каждого есть свое собственное описание элемента, а не просто использовать 1 UIViewController для всех элементов в моем табличном представлении, и когда каждый элемент был нажат, каждый из них открывает свои собственныеПосмотреть.Очевидно, я не знаю, как кодировать в этой части, поэтому я надеюсь, что кто-то может помочь мне с этой частью моего проекта iPhone, спасибо

1 Ответ

5 голосов
/ 06 апреля 2011

Пожалуйста, не создавайте 21 различных контроллеров представления, только чтобы показать разные элементы. Вместо этого установите свойство GlossaryDetailViewController, которое содержит экземпляр элемента модели данных.

Учтите это ...

- (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 ответственным за настройку собственных данных.

Редактировать Вы также заметите, что я удалил ссылки на делегат приложения. Вам не нужно, чтобы получить доступ к контроллеру навигации. Каждый контроллер представления в стеке контроллера навигации имеет ссылку на него. Хотя я полностью разрываю ваш код на части, я бы также учел создание контроллера представления, переопределив метод получения для glossaryDetailViewController, например:

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

    return glossaryDetailViewController;
}

Если вы пойдете по этому пути, вы можете удалить оператор if и просто позвонить self.glossaryDetailViewController.

...