典型的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
答案 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 = myCustomDelegateInstance
和self.tableView.dataSource = myCustomDataSourceInstance
。
现在,通过控制器发出的任何呼叫都将被分派到您的自定义处理程序。很基本的。
真正做到这一点的唯一原因是,如果你1)有一个非常臃肿的控制器,或2)你需要重用dataSource并在其他地方委托方法,你想避免代码重复。否则,将其放置可能是更好的做法。
答案 2 :(得分:0)
您可以创建separe类(使用UITableViewDelegate,UITableViewDataSource)并将它们作为外部文件添加到IB中并链接IBActions
答案 3 :(得分:0)
在IB中,您可以将“外部对象”从Library-&gt; Cocoa Touch-&gt;控制器拖到xib窗口中。然后,您可以选择该对象,查看检查器并设置类。它现在可以作为代表等。