Подкласс UITableView - PullRequest
       5

Подкласс UITableView

0 голосов
/ 16 сентября 2011

Я хочу подкласс UITableView, который рисует пользовательские заголовки разделов.Я попытался сделать следующее:

#import <UIKit/UIKit.h>
@interface MyTableView : UITableView
@end
@implementation MyTableView
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
  //my drawing code goes here
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
  //returns the height
}
@end

Однако, когда я использую этот класс, он рисует обычные заголовки.Что я делаю не так?

Когда я устанавливаю эти функции непосредственно в контроллер (без подклассов), он работает нормально.

ОБНОВЛЕНИЕ: У меня уже есть много классов, которые используют UITableView, я хочу создать подклассэто потому, что может быть быстрее просто изменить класс, который пишет нужные классы.Как я могу изменить названия, просто изменив класс, это возможно?

Ответы [ 3 ]

2 голосов
/ 16 сентября 2011

Это происходит потому, что вы унаследовали класс UITableView, и эти методы не из UITableView, а из UITableViewDelegate.

Он работает на вашем контроллере, поскольку либо вы установили delegate свойство вашего UITableView, указывающее на ваш контроллер, или вы используете UITableViewController, для которого делегат просмотра таблицы устанавливается автоматически.(На самом деле, в вашем случае, использование UITableViewController хуже, потому что оно уже реализует UITableView вместо вашего пользовательского класса).

EDIT: К сожалению, из-за используемого шаблона делегирования в UITableView классе для изменения его представлений заголовка раздела не просто реализовать этот вид действия

Один из способов сделать это - предоставить эти «вспомогательные» методы в вашем классе, а затем реализовать делегат накаждый из ваших контроллеров должен правильно вызывать эти методы при запуске метода делегата.

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

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

1 голос
/ 16 сентября 2011

Я не понимаю, почему вы используете TableView, а не MyTableView:

@implementation MyTableView

UPDATE:

Проверьте, правильно ли установлены свойства dataSource и delegate этой таблицы.

UPDATE2:

Вы должны подкласс от UITableViewController:

@interface MyTableView : UITableViewController
@end
0 голосов
/ 16 сентября 2011

Вы можете создать подкласс UITableViewController, обрабатывая viewForHeaderInSection и heightForHeaderInSection, а затем использовать MyTableViewController в качестве базового класса для каждого представления таблицы, для которого вы хотите иметь свои собственные заголовки. Тем не менее, viewForHeaderInSection будет нуждаться в информации, необходимой для создания UILabel или чего-либо, что вы собираетесь использовать для отображения заголовка, поэтому вам понадобится некоторый непротиворечивый код в ваших подклассах, который будет обеспечивать это - как NSArray, заполненный строки, которые вы хотите использовать для заголовков, или метод, который можно вызвать из viewForHeaderInSection.

...