Проблема обновления UITableView - PullRequest
2 голосов
/ 11 марта 2011

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

У меня есть ViewController и пользовательский UITableViewController, который удастся правильно настроить таблицу, когдаприложение запускается с использованием NSMutableArray, содержащегося в контроллере.

Когда я перехожу на страницу, содержащую таблицу, ViewController вызывает функцию, которая получает данные с сервера с помощью HTTP-запроса и разбораэто в NSMutableArray.

Теперь вот моя проблема.Мне удается отправить этот массив на мой UITableViewController, но когда я хочу обновить свой tableView, ничего не происходит.

Я пытался использовать [myTable reloadData], но он не вызывает numberOfRowsInSection или cellForRowAtIndexPath функции.Я видел, что люди с той же проблемой решили ее, используя [self.myTable ReloadData], но я получаю ошибку:

доступ к неизвестному методу получения / установки

Я довольно новичок вtarget-C, и эта ошибка все еще немного загадочна для меня, поскольку я получаю ее немного случайно.

В любом случае, есть большая вероятность, что я напутал с объявлением UITableViewController (гдея должен объявить это?) и со ссылками Interface Builder, так что это может быть ключом к поиску решения.

У кого-нибудь есть идея?

Большое спасибо!

РЕДАКТИРОВАТЬ: Вот мой класс контроллера таблицы просмотра:

#import "MyCell.h"

@class Mycell;

@interface MyTableController : UITableViewController {

    IBOutlet MyCell * myCell;
    IBOutlet UITableView * myTable;
    NSMutableArray *data;

}

@property (nonatomic, retain) IBOutlet UITableView * myTable;
- (void) EditTable : (NSMutableArray*) param;


@end

А теперь .m:

@implementation MyTableController
@synthesize myTable;

- (void) viewDidLoad {

[super viewDidLoad];
myTable = [[UITableView alloc] init];   
data = [[NSMutableArray alloc] init];
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

return 1;

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return [data count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"MyCell";

MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];  >

if (cell == nil) {

    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:self options:nil];

    for (id currentObject in topLevelObjects){

        if ([currentObject isKindOfClass:[UITableViewCell class]]){

        cell =  (MyCell *) currentObject;

            }
        }

    }


    NSString *datastring = [listenom objectAtIndex:indexPath.row];
    [cell setCell: datastring ];
    return cell;
}


- (void) EditTable : (NSMutableArray*) param{   

//This function is called by the ViewController when the user goes to the page containing the view

    data = param; //The param array contains the data from the HTTP request

    [self.tableView reloadData];

    [self.myTable reloadData]; //I tried both, but only the first one actually calls the previous functions

}

Ответы [ 3 ]

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

У вас есть ряд проблем в этом примере кода. Я укажу некоторые из них здесь, но я настоятельно рекомендую прочитать соответствующую документацию Apple по адресу:

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

и

http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/TableView_iPhone/AboutTableViewsiPhone/AboutTableViewsiPhone.html

Некоторые проблемы в вашем коде:

  1. Поскольку класс MyTableController является подклассом UITableViewController, вам не нужны атрибут и свойство для myTableView. Свойство tableView определяется и инициализируется как часть реализации UITableViewController с его источником данных и делегатом, установленным для экземпляра UITableViewController. Вот почему [self.tableView reloadData] вызывает методы вашего делегата и протокола источника данных.

  2. Вы также используете конструктор интерфейсов, поэтому, если вы действительно хотите создать свои собственные подпредставления, вы должны либо сделать это в IB и установить точку выхода, либо сделать это в своем коде, что означает создание подпредставлений в viewDidLoad, а затем добавьте их к вашему виду с помощью [view addSubview:mySubView].

  3. Лучший способ установить данные для вашей таблицы - создать свойство для вашего атрибута data и вызвать setData из контроллера представления, который инициализировал экземпляр MyTableController. Для этого вы должны использовать метод setData:. Вы можете позвонить [self.tableView reloadData] в setData. Вам не нужно явно перезагружать таблицу при загрузке представления, поскольку это делается автоматически. Более важный момент: если вы останетесь с EditTable, я бы переименовал его, чтобы он был более описательным и использовал случай верблюда (например, setDataForTable`), чтобы соответствовать соглашениям iOS.

  4. Вы не показываете init / alloc для атрибута listenom, на который есть ссылка в tableView:cellForRowAtIndexPath:. Вы хотели использовать data вместо этого?

  5. Является ли ваш файл MyTableController.m полной версией? Если это так, то вам не хватает методов viewDidUnload и dealloc. Оба из которых требуются. viewDidUnload должен освободить все объекты, выделенные в viewDidLoad, а dealloc должен освободить все, что осталось от контроллера (включая объекты, выпущенные в viewDidUnload.

0 голосов
/ 11 марта 2011

сначала вам нужно синтезировать, затем вы можете использовать self.myTable

do сверху

@synthesize myTable

, а затем

[self.myTable reloadData];
0 голосов
/ 11 марта 2011

Поскольку вы используете tableViewController, вы можете использовать self.tableView вместо того, чтобы перезагрузить данные, подобные этим

[self.tableView reloadData];
...