2010-03-10 4 views
3

У меня есть несколько классов UITableViewController, и я только заметил, что эти методы не называют:viewWillAppear не вызван в UITableViewController?

-(void)viewWillAppear:(BOOL)animated; 
-(void)viewDidAppear:(BOOL)animated; 

Я прочитал в http://discussions.apple.com/thread.jspa?threadID=1529769&tstart=0, что я должен был бы назвать те методы себя, выдвигая контроллеры просмотра, но это странно , поскольку он работает только для UITableViewController.

Также делает это немного проблемой, когда мне нужно, чтобы UITableViewCell не был выбран в UIViewController, который нажал UITableViewController.

+0

Что вопрос? – pheelicks

+0

Извините .. Почему UITableViewController не вызывает эти методы по умолчанию? – runmad

ответ

4

Кто-нибудь разрешил это, потому что исходное сообщение правильное - просто используя UITableViewController и нажав на табличный вид этого контроллера на navController, НЕ запускает эти методы, несмотря на то, что он должен. У меня есть серия UITableViewControllers и представления таблиц, которые вытолкнуты и выведены для отображения иерархических данных - ничего необычного, но методы «viewWill/Did/Appear/Disappear» никогда не вызываются. Вызывается только viewDidLoad и viewDidUnload.

В обеих наших установках должна быть проблема с подключением, но простое нажатие на просмотр в навигационном контроллере должно быть всем, что требуется (?) - трудно поверить, что это могло остаться незамеченным в качестве основной ошибки так долго.

?

0

Эти два метода вызывается по умолчанию для уведомления об изменениях. UITableViewController является подклассом UIViewController, поэтому будет такое же поведение. Вы можете увидеть больше в разделе View Controller Programming Guide

Методы viewWillAppear: и viewDidAppear: дают подклассам возможность выполнять любые дополнительные действия, связанные с внешним видом представления.

Откуда вы знаете, что эти методы не называются? Можете ли вы предоставить еще несколько кодов или, по крайней мере, вы проверите их с помощью NSLog(), чтобы узнать, есть ли какие-либо сообщения.

+0

Я установил точки останова и NSLogs, и ничего не происходит. – runmad

+0

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

+0

Трудно в поле комментариев. В основном у меня есть UINavigationController, а в navigationBar у меня есть UISegmentedControl. При переключении сегмента пользователь переключается между двумя видами (профиль и заказы). Нажатие на заказ должно вывести представление на другое представление (внутри того же UINavigationController), в котором указаны данные заказа. По сути, это то же самое, что в разделе «Рекомендуемые» приложения App Store. У вас есть 3 сегмента, каждый со своим UITableView, который может входить в новое представление. У меня было много проблем, пытающихся это сделать. – runmad

9

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

Как насчет установки свойства делегирования UINavigationController, а затем реализации UINavigationControllerDelegate? Он обеспечивает два дополнительных метода:

– navigationController:willShowViewController:animated: 
– navigationController:didShowViewController:animated: 

Например, navigationController: willShowViewController: анимированные: может выглядеть примерно так:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
    if ([viewController isKindOfClass:[UITableViewController class]]) { 
    [viewController viewWillAppear:animated]; 
    } 
} 

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

0

У меня такая же проблема. У меня есть простой UIView из IB, и я делаю addSubview с классом, который расширяет UITableViewController.

Я вижу представление TableViewController без проблем в своем приложении, но функция viewWillAppear никогда не вызывается в этой ситуации.

+0

Я узнал, что эти методы делегатов вызываются только для класса UIViewController. – runmad

0

Хорошо, обсуждение, связанное с вопросом, имеет ответ прямо в нем. UINavigationController должен получить сообщение «viewWillAppear», чтобы он мог отправлять эти сообщения контроллерам представлений, которые вы нажимаете на него.

Так иронично, если вы не делаете то, что рекомендует Apple, и вы подклассифицируете UINavController для своего контроллера взгляда, тогда все отлично работает.

Однако, если вы просто создаете UINavController внутри своего контроллера представлений, вам необходимо реализовать «viewWillAppear», «viewDidAppear» и т. Д. И перенаправить их на ваш навигационный контроллер.

Обратите внимание, что это особенно важно, если вы используете Three20, потому что его иерархия контроллера представления ожидает получения сообщения «viewWillAppear». Если это не так, вы можете получить TTTableViews, которые не рисуются.

0

То же самое может произойти, если вы используете UITabViewController. Вы должны заставить вызов viewWillAppear путем реализации либо UITabViewControllerDelegate или UINavigationControllerDelegate обратных вызовов

Смежные вопросы