Как я могу создать подкласс UITableView? - PullRequest
5 голосов
/ 05 февраля 2012

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

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

Я не думаю, что мне нужен UITableViewController, поскольку этот UITableView, который я хочу построить, должен жить в различных UIViewController (и эти UIViewController могут иметь собственные UITableViews).

Я вложил в свой UITableView субкласс как:

@interface ShareUITableView : UITableView

но ни один из его методов не вызывается.

Мой ShareUITableView создается через NIB путем установки пользовательского класса в ShareUITableView. В коде я подтвердил, что экземпляр ShareUITableView создан.

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

Есть идеи?

Ответы [ 3 ]

7 голосов
/ 05 февраля 2012

Если я вас понял, вам нужно это объявление класса:

@interface ShareUITableView : UITableView <UITableViewDataSource>

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

- (id)init
{
    //...
    self.dataSource = self;
    //...
}

Конечно, класс должен будет принять протокол.

Удачи!

5 голосов
/ 02 апреля 2014

MyTableView.h

// MyTableView.h

// This overrides the UITableViewDataSource with your own so you can add any methods   you would like.
@protocol MyTableViewDataSource <UITableViewDataSource>

@required
// This is where you put methods that are required for your custom table to work (optional)
- (int)myRequiredMethod;

@optional
// This is where you put methods that are optional, like settings (optional)

@end

// This overrides the UITableViewDelegate with your own so you can add any methods you would like.
@protocol MyTableViewDelegate <UITableViewDelegate>

@required
// This is where you put methods that are required for your custom table to work (optional)

@optional
// This is where you put methods that are optional, like settings (optional)

@end

// Make sure you add UITableViewDelegate and UITableViewDataSource implementations.
@interface MyTableView : UITableView <UITableViewDelegate, UITableViewDataSource> {

    // Your customer datasource and delegate.
    id <MyTableViewDataSource> myDataSource;
    id <MyTableViewDelegate> myDelegate;
}

@end

MyTableView.m

// MyTableView.m

#import "MyTableView.h"

@implementation MyTableView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code

        // This is how you can use your custom method.
        int i = [myDataSource myRequiredMethod];
    }
    return self;
}

- (void)awakeFromNib {
    // This assigns the delegate and datasource you assigned to File's Owner in your xib to your custom methods
    myDataSource = (id<MyTableViewDataSource>)self.dataSource;
    myDelegate = (id<MyTableViewDelegate>)self.delegate;
    self.delegate = self;
    self.dataSource = self;
}

// This is an example of how to override an existing UITableView method.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    // This calls the method implemented in your ViewController. See Below.
    NSInteger rows = [myDataSource tableView:tableView numberOfRowsInSection:section];

    return rows;
}

@end

MyViewController.h

// MyViewController.h

#import "MyTableView.h"

// Use MyTableViewDataSource and MyTableViewDelegate instead of UITableViewDataSource and UITableViewDelegate
@interface MyViewController : UIViewController <MyTableViewDataSource, MyTableViewDelegate> {

@end

MyViewController.m

// MyViewController.m

#import "MyViewController.h"

@interface MyViewController ()

@end

@implementation MyViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
}

// This method will be overridden by myTableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 1;
}

- (int)myRequiredMethod {
    return 2;
}

Создание подклассов - отличный способ сделать многократно используемые элементы пользовательского интерфейса.

2 голосов
/ 05 февраля 2012

Я думаю, вы все равно должны пойти с классом Controller. Я ожидаю, что создание подклассов UITableView будет утомительной работой - если возможно, с разумным количеством вообще.

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

посмотрите на этот ответ: Реализация делегата во время выполнения?

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

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

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