Добавление в табличное представление с использованием модального контроллера представления - PullRequest
1 голос
/ 04 июня 2011

повсюду в Интернете я нахожу примеры того, как добавлять строки в табличное представление, используя специальную строку «Добавить строку» с зеленым плюсом. Но я этого не хочу.

Я хочу иметь кнопку «плюс» в заголовке MyTableViewController и вызывать некоторый Modal Add View Controller с файлом XIB с одним текстовым полем, чтобы заполнить его. В этом Modal Add View Controller я хочу заполнить это текстовое поле, и после того, как я нажму «Готово», Modal Add View Controller закрывается, и я хочу найти этот текст, добавленный в табличное представление MyTableViewController.

У меня есть свойство в MyTableViewController для хранения всех его строк:

@property (nonatomic, retain) NSMutableArray *list;;

Я просто не могу заставить работать строки. Я не вижу, где я мог бы сделать

[list addObject:];

Вот код метода addItem MyTableViewController, который я вызываю, когда пользователь нажимает кнопку плюса в строке заголовка:

- (IBAction) addItem: (id) sender;
{
    NSLog(@"Adding item...");
    //Preparing "Add View" which has a single text field
    AddViewController *addViewController = [[AddViewController alloc] init];
    addViewController.title = @"Add Item";

    UINavigationController *modalController = [[UINavigationController alloc]
    initWithRootViewController:addViewController];
    [addViewController release];

    // Showing the prepared Add View controller modally
    [self.navigationController presentModalViewController:modalController animated:YES]
    NSLog(@"Modal controller has been presented.");

    [modalController release];
}

А вот код в AddViewController, который вызывается после ввода текстового поля и нажатия кнопки «Готово» в строке заголовка:

- (IBAction) done: (id) sender
{
    NSLog(@"Reached Done");
    if (textField != nil) {
        self.fieldText = textField.text;
    }
    NSLog(@"About to dissmiss modal controller...");
    [[self parentViewController] dismissModalViewControllerAnimated:YES];
    NSLog(@"Modal controller has been dismissed."); 
}

Ответы [ 2 ]

2 голосов
/ 04 июня 2011

Довольно распространено создание протокола делегата для такого Add Controller и сделать родительский контроллер его делегатом.

Когда Add Controller «сделан» (то есть не отменен с помощью возможной кнопки «Отмена»), он вызывает метод делегата, скажем, addControllerIsDone:, чтобы позволить родительскому контроллеру представления таблицы знать, что он должен принять установленное значение, добавить это к списку, и отклонить Add контроллер.

Вы также можете передать список в Add Controller и позволить ему добавить заданное значение перед вызовом [parentViewController dismissModalViewControllerAnimated:YES].

Это зависит от того, хотите ли вы сохранить контроль над списком в контроллере табличного представления или передать его в Add Controller.

И после того, как Add Controller отклонен, вы можете либо выяснить, где ячейка для новой записи должна быть добавлена ​​в tableView и вставить ее с хорошей анимацией, перезагрузить раздел (анимация также возможна) или весь tableView (анимация не возможно).


Первый вариант может выглядеть следующим образом:

@class AddViewController;

@protocol AddViewControllerDelegate <NSObject>
- (void)controllerIsDone:(AddViewController *)controller;
@end

@interface AddViewController : UIViewController
@property (nonatomic, assign) id<AddViewControllerDelegate> delegate;
@end

И код "Готово"

- (IBAction) done: (id) sender
{
    ......
    [self.delegate controllerIsDone:self];
    NSLog(@"About to dissmiss modal controller...");
    [[self parentViewController] dismissModalViewControllerAnimated:YES];
    NSLog(@"Modal controller has been dismissed."); 
}

И MyViewController:

@interface MyViewController : UIViewController <AddViewControllerDelegate>
@end

Так что он должен реализовать метод controllerIsDone:. Вот так например:

- (void)controllerIsDone:(AddViewController *)controller
{
    [self.list addObject:controller.textField.text];
}

Поскольку AddViewController отклоняет себя, MyViewController не должен делать это в методе делегата. Но хорошей практикой было бы то, что если вы открыли модальный контроллер вида, вы также должны отклонить его, только ради симметрии. ;)

В этом случае, конечно, textField должен быть общедоступным свойством.

Я уверен, что вы найдете второй вариант.

Читайте о Шаблон декоратора в Руководстве по основам какао .

0 голосов
/ 28 июля 2011

После того, как вы уволите свой модальный контроллер:

[self addObjectToMyModel:newObject];

так, что если бы вы позвонили [tableView reloadData], он появился бы, но вам не нужно звонить, вместо этого:

вам нужно знать, где новый объект появится в вашей таблице, определить indexPath и:

NSIndexPath *indexPathOfInsertedCell = …;
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPathOfInsertCell]
                    withRowAnimation:UITableViewRowAnimationFade];
...