Невозможно добавить строку в UITableView - PullRequest
2 голосов
/ 17 февраля 2012

Я новичок в программировании iOS, и у меня проблема с добавлением новой ячейки в объект UITableView.Я использую раскадровку, и одна из сцен - это UIViewController, который имеет несколько подпредставлений: текстовые поля, табличное представление и т. Д. Я намерен добавить строки в этот табличный вид из сцены детализации.

Я могуПервоначально добавить строки в таблицу, но я не могу добавить строку впоследствии.Когда я нажимаю кнопку, чтобы добавить строку, я вызываю метод '[self.stepsListTableView reloadData];'который вызывает метод '- (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) section' и возвращает правильное значение, включая новый элемент массива.Но метод '- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath' не вызывается для обновления таблицы.

Я не понимаю, что я делаю неправильно.

Подробная информация о моем исходном коде:

WorkoutDetailsViewController.h

(…)
@interface WorkoutDetailsViewController : UIViewController <StepDetailsViewControllerDelegate, UITextFieldDelegate, UITableViewDelegate, UITableViewDataSource>

@property (nonatomic, weak) id <WorkoutDetailsViewControllerDelegate> delegate;
@property (nonatomic, strong) Workout *workout;
(…)
@property (nonatomic, retain) IBOutlet UITableView *stepsListTableView;
(…)

WorkoutDetailsViewController.m

(…)
@synthesize stepsListTableView;
(…)
- (void)viewDidLoad
{
    [super viewDidLoad];

    addButton.enabled = FALSE;

    workoutNameField.delegate = self;
    if (self.workout == nil) {
        self.workout = [[Workout alloc] init];  
        self.stepsListTableView = [[UITableView alloc] init];
    }  
    self.stepsListTableView.delegate = self;
    self.stepsListTableView.dataSource = self;

}

(…)

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{
    return 1;
}

// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
    //return [self.workout.stepsList count];
    NSInteger counter = 0;
    counter = [self.workout.stepsList count];
    return counter;
}

// 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];
    }
    // Set up the cell...
    // Pending

    return cell;
}

- (void)stepDetailsViewControllerDidDone:(StepDetailsViewController *)controller
{
    [self.workout.stepsList addObject:controller.step];
    NSInteger counter = [self.workout.stepsList count];

    [self.stepsListTableView beginUpdates];

    NSArray *paths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:(counter-1) inSection:0]];
    [self.stepsListTableView insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationTop];

    [self.stepsListTableView endUpdates];

    [self.stepsListTableView reloadData];
}

(…)

Также в раскадровке я настроил розеткиделегат и источник данных для представления контроллера.

Есть идеи?

С уважением, JoanBa

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

Я решил проблему.С помощью отладчика я обнаружил, что метод reloadData вызывался для другого UITableView, чем тот, который был инициализирован в viewDidLoad.

Я просмотрел настройки UITableView в раскадровке, которые, по-видимому, были правильными, но я удалил их и создал заново.Теперь это работает.

В заголовке UIViewController у меня есть строка

@property (nonatomic, retain) IBOutlet UITableView *stepsListTableView;

и в реализации я прокомментировал строки

//self.stepsListTableView.delegate = self;
//self.stepsListTableView.dataSource = self;

И, конечно же, в раскадровке яопределили для UITableView следующие отношения:

Выходы: dataSource, делегат -> UIViewController

Ссылочный выход: UITableView -> UIVIewController

Вот и все !!

0 голосов
/ 17 февраля 2012

Возможно, для табличного представления установлено статическое содержимое.Выберите UITableView в раскадровке и в разделе «Инспектор атрибутов» меню в правой части экрана выберите поле «Содержимое» под заголовком «Представление таблицы» и установите значение «Динамические прототипы».Снимок экрана для ясности:

enter image description here

Этот маленький трюк несколько раз ловил меня, когда я начинал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...