从主UIViewController类中分离UITableview数据源和委托的简单方法?

时间:2010-01-19 22:57:46

标签: iphone objective-c xcode

典型的UITableView使用模式是让主UIViewController成为它所持有的UITableView的目标数据源和委托。

是否有任何简单易懂的教程可以帮助我弄清楚如何将与UITableViewDelegate和UITableViewDataSource方法相关的代码移动到一个单独的类中并将其挂钩到我的UIViewController?理想情况下,我希望将委托和数据源都放在同一个类中。

现在,我正在通过Interface Builder创建UITableView并将其插座连接到我的控制器类。

典型代码:

@interface MyController : UIViewController <UITableViewDelegate, UITableViewDataSource>
{
    IBOutlet UITableview *myTableview;
}

我想做更多这样的事情:

@interface MyController : UIViewController 
{
    IBOutlet UITableview *myTableview;
}
@end

@interface MyTableSourceDelegate : NSObject<UITableViewDelegate, UITableViewDataSource>
{
}

@implementation MyTableSourceDelegate
    // implement all of the UITableViewDelegate and methods in this class 
@end

4 个答案:

答案 0 :(得分:3)

我花了2个小时来解决这个问题:

这对我有用

//  GenreDataSource.h

#import Foundation/Foundation.h

    @interface GenreDataSource : NSObject <UITableViewDataSource> {
        NSArray *dataSource;
        CGSize cellSize;
    }

@property(nonatomic, assign) CGSize cellSize;

@end



//  GenreDataSource.m
#import "GenreDataSource.h"

@implementation GenreDataSource
@synthesize cellSize;

-(id)init{

    self = [super init];
    if ( self != nil ) {

        dataSource = [[NSArray alloc] initWithObjects:@"All",@"Folk",@"Disco",@"Blues",@"Rock",@"Dance",@"Hip-Hop",@"R&B",@"Soul",@"Lounge",@"Techno",@"Bubstep", nil];
    }
    return self;
}

#pragma mark - UITableViewDataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [dataSource count];
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {

        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero] autorelease];
        [cell setSelectionStyle:UITableViewCellSelectionStyleGray];

        //сконфигурируем структуру
        FontLabel *fLabel= [[FontLabel alloc] initWithFrame:CGRectMake(30, 
                                                                       5, 
                                                                       cellSize.width-30, 
                                                                       cellSize.height-5)
                                                   fontName:@"HelveticaNeueCondensedBlack" 
                                                  pointSize:18.0f];
        [fLabel setTextColor:[UIColor darkTextColor]];
        [fLabel setTag:101];
        [fLabel setBackgroundColor:[UIColor clearColor]];
        [cell.contentView addSubview:fLabel];
        [fLabel release];
    }

    FontLabel *fLabel = (FontLabel*)[cell viewWithTag:101];
    [fLabel setText:[dataSource objectAtIndex:indexPath.row]];

    return cell;
}

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

@end

答案 1 :(得分:2)

首先的事情是,如果您正在使用带有界面构建器的UITableViewController子类,您将需要断开默认情况下已连接的委托和数据源出口。 (提示,查看连接检查器)。即使在viewController中有一个tableView,也请检查。

第二次创建您的课程,并确保他们符合<UITableViewDelegate><UITableViewDataSource>。如果您使用objc,则可能需要在.h文件中声明此合同。

第三次,在视图控制器中实例化此类或两​​个单独的类,如viewDidLoad,然后分配self.tableView.delegate = myCustomDelegateInstanceself.tableView.dataSource = myCustomDataSourceInstance

现在,通过控制器发出的任何呼叫都将被分派到您的自定义处理程序。很基本的。

真正做到这一点的唯一原因是,如果你1)有一个非常臃肿的控制器,或2)你需要重用dataSource并在其他地方委托方法,你想避免代码重复。否则,将其放置可能是更好的做法。

答案 2 :(得分:0)

您可以创建separe类(使用UITableViewDelegate,UITableViewDataSource)并将它们作为外部文件添加到IB中并链接IBActions

答案 3 :(得分:0)

在IB中,您可以将“外部对象”从Library-&gt; Cocoa Touch-&gt;控制器拖到xib窗口中。然后,您可以选择该对象,查看检查器并设置类。它现在可以作为代表等。