UIToolBar с UITableView - TableView не обновляется при загрузке

UIToolBar имеет два представления: UIView с UITextViews и UIView с UITableView.

UITableView, который вызывается через UIToolBar. При первой загрузке UITableView попадает в БД и получает информацию. Я «перехожу» обратно к UIView с UITextViews, выбираю некоторые данные, а затем «перехожу» обратно к UITableView, но ни один из методов делегата не вызывается, например, viewDidLoad или initWithNibName или что-то еще, поэтому данные в таблице устарели.

Итак, я узнал способ

-(void)viewWillAppear:(BOOL)animated { 

называется, ОДНАКО, у него нет доступа к tableView, например,

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

Я наткнулся на эту рекомендацию:

«Кажется, я не могу понять, как обновить UITableView ... Я нашел это, похоже, та же проблема, что и у меня,

Я создал свойство MyTableViewController* в классе MyModalViewController. Перед presentModalView я сохраняю указатель контроллера табличного представления на это свойство в контроллере модального представления.

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

Чувствует себя грязным, но работает».

Если это ответ, я не уверен, как его кодировать.

Спасибо вперед!

  • sk

Примечание. Я только что попробовал это:

.h

 UITableView *tableViewPtr; 
@property (nonatomic, retain) UITableView *tableViewPtr; 

.m

@synthesize tableViewPtr; 

И хранить в -

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {:
 ... 
 self.tableViewPtr = tableView; 
 ... 

Затем попробуйте вызвать его из

-(void)viewWillAppear:(BOOL)animated {
 [self.tableViewPtr reloadData]; 

Но это, кажется, не работает.


person mr-sk    schedule 02.06.2009    source источник
comment
Я тоже пробовал это: .h UITableView *tableViewPtr; @property (неатомарное, сохраняемое) UITableView *tableViewPtr; .m @synthesize tableViewPtr; И сохраните его в - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {: ... self.tableViewPtr = tableView; ... Затем попробуйте вызвать его из -(void)viewWillAppear:(BOOL)animated {: [self.tableViewPtr reloadData]; Но это, кажется, не работает.   -  person mr-sk    schedule 02.06.2009
comment
Господи, последний комментарий сорвался. Прости.   -  person mr-sk    schedule 02.06.2009


Ответы (4)


mr-sk: Вероятно, вам нужно немного больше узнать о том, как работает Objective-C. Когда вы объявляете UIViewController (или подкласс), вы просто реализуете протоколы UITableView:

@interface ViewWithTableView : UIViewController
    <UITableViewDelegate, UITableViewDataSource> {...}

Затем вы реализуете необходимые методы протокола внутри вашего viewController. Есть только несколько методов, которые вам нужно реализовать для поддержки tableView.

Если вы используете IB, определите свой интерфейс следующим образом:

@interface ViewWithTableView : UIViewController
    <UITableViewDelegate, UITableViewDataSource> {
    IBOutlet UITableView *yourTableView;
    . . .
}

и сохраните его, затем перейдите в IB и щелкните правой кнопкой мыши tableView. Нажмите и перетащите привязки из DataSource и Delegate в ваш viewController (вероятно, ваш владелец файла). Затем щелкните viewController и введите cmd-4. Выберите «ViewWithTableView» или как вы его назвали в раскрывающемся списке «Класс» в разделе «Идентификация класса». Сохраните все и все заработает.

Обратите внимание, что если вы не добавите @property для своего tableView, вы не будете вызывать себя, потому что нет доступа:

[yourTableView whatever:withWhatever];

Как и в случае с любым кодом, набранным с ходу, ваш пробег может варьироваться. :\

person user126244    schedule 27.08.2009

Спасибо за помощь. Наконец-то решил, и вот проблема:

1) Мой контроллер расширял UIViewController, а НЕ UITableViewController.

Как только я расширил правильный класс, а затем правильно подключил его через File's Owner и IB, все заработало. Теперь в viewWillAppear я могу вызвать self.tableView reloadData.

Больше никогда не совершим эту ошибку!

Спасибо всем -

sk

person mr-sk    schedule 03.06.2009

Вы можете использовать UIViewController — вам просто нужно реализовать протоколы UITableViewDelegate и UITableViewDataSource.

--r

person user126244    schedule 17.08.2009

в представлении появится метод (который, как я предполагаю, находится в вашем классе контроллера) вызов

[self.tableView reloadData];
person zpesk    schedule 02.06.2009
comment
FavoriteViewController.m:115: ошибка: запрос члена tableView в чем-то, что не является структурой или объединением. У меня нет свойства класса с таким именем. Когда я ссылаюсь на tableView, я ссылаюсь на аргумент, передаваемый методами tableView. - person mr-sk; 02.06.2009
comment
ваш контроллер табличного представления должен иметь доступ к tableView - вы в правильном файле ??? - person zpesk; 02.06.2009
comment
Да, я в ViewController, который содержит UIView и UITableView. Чего я не понимаю, так это того, КАК он будет иметь доступ. Другие методы в контроллере (- (UITableViewCell *) tableView: (UITableView *) tableView) должны передаваться в tableView... Итак... я не понимаю, зачем мне иметь к нему доступ. Как я уже сказал, я не создавал свойство tableView для этого класса (но мог бы). В моем первом сообщении описывается структура моего проекта (UITabController с двумя UIViewController). - person mr-sk; 02.06.2009
comment
Чтобы уточнить: mr-sk.com/iphone/current.png -FavoriteViewController — это тот, о котором я говорю. - person mr-sk; 02.06.2009