Реализовать делегат во время выполнения? - PullRequest
1 голос
/ 25 января 2012

У меня есть универсальный класс контроллера представления, который наследует все классы контроллера представления в моем приложении, у которого есть следующий loadView метод:

- (void) loadView
{
    if (viewType == UIStandardViewControllerViewTypeUIView)
    {
        UIView *view = [[UIView alloc] initWithFrame: [[UIScreen mainScreen] applicationFrame]];
        [self setView: view];
        [view release];
    }
    else if (viewType == UIStandardViewControllerViewTypeUIScrollView)
    {
        UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame: [[UIScreen mainScreen] applicationFrame]];
        [self setView: scrollView];
        [scrollView release];
    }
    else if (viewType == UIStandardViewControllerViewTypeUITableViewPlain || viewType == UIStandardViewControllerViewTypeUITableViewGrouped)
    {
        UITableViewStyle tableViewStyle; 

        if (viewType == UIStandardViewControllerViewTypeUITableViewPlain)
        {
            tableViewStyle = UITableViewStylePlain;
        }
        else 
        {
            tableViewStyle = UITableViewStyleGrouped;
        }

        UITableView *tableView = [[UITableView alloc] initWithFrame: [[UIScreen mainScreen] applicationFrame] style: tableViewStyle];
        [self setView: tableView];
        [tableView release];
    }

    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
    [[self navigationItem] setBackBarButtonItem: backButton];
    [backButton release];
}

Я сделал это таким образом для многихпричины, по которым мне не хочетсяВ любом случае, как вы заметите, один из типов представлений, которые нужно реализовать, это tableview.Как мы все знаем, tableview нужны delegate и datasource.Мне было интересно, возможно ли реализовать <UITableViewDelegate, UITableViewDataSource> во время выполнения, когда я знаю, что выбор таблицы - это выбор, который был сделан?

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

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

1 Ответ

3 голосов
/ 25 января 2012

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

Также обратите внимание, что вы используете шаблон Factory. Вы должны использовать метод класса для создания новых представлений. Подпись будет что-то вроде +(UIView *)viewWithType:(ViewTypeStyle) viewTypeSyle)

TableController.h

#import <Foundation/Foundation.h>

@interface TableController : NSObject <UITableViewDataSource,UITableViewDelegate>

@end

TableController.m

#import "TableController.h"

@implementation TableController

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 100;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"MyCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
    }
    cell.textLabel.text = [NSString stringWithFormat:@"%i", indexPath.row];
    return cell;
}
@end

ViewController.m

#import "ViewController.h"
#import "TableController.h"

@interface ViewController ()
@property(nonatomic,retain) UITableView *tableView;
@property(nonatomic,retain) TableController *controller;
@end

@implementation ViewController
@synthesize tableView = tableView_;
@synthesize controller = controller_;


-(void)dealloc
{
    self.tableView = nil;
    self.controller= nil;
    [super dealloc];
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.controller = [[[TableController alloc] init] autorelease];
    self.tableView = [[[UITableView alloc] initWithFrame:self.view.frame] autorelease];
    self.tableView.delegate = self.controller;
    self.tableView.dataSource= self.controller;

    [self.view addSubview:self.tableView];

    // Do any additional setup after loading the view, typically from a nib.
}

//...

@end
...