如何设置以编程方式创建的TableView的子类? (没有故事板)

时间:2013-06-30 03:50:43

标签: iphone ios objective-c uitableview

我正在使用自定义框架,我需要将我的'TableView'和'TableViewCell'的子类设置为自定义框架。我通常会使用身份检查员轻松完成此操作,但由于我以编程方式创建了所有内容,因此我不知道该怎么做。我也没有使用故事板。有什么提示吗?

--- ----编辑

TableViewController.h

#import <UIKit/UIKit.h>
#import "Tasks.h"
#import "Properties2ViewController.h"
#import "PKRevealController.h"
#import "FMMoveTableView.h"
#import "FMMoveTableViewCell.h"
#import "DetailViewController.h"
@interface ToDoTableViewController : UITableViewController <Properties2ViewControllerDelegate, UITableViewDelegate, FMMoveTableViewDataSource>
@property (strong, nonatomic) NSMutableArray *taskArray;
-(IBAction)addCell:(id)sender;
@end

TableViewController.m

#import "ToDoTableViewController.h"

@implementation ToDoTableViewController
@synthesize taskArray;
- (id)init {
    self = [super initWithStyle:UITableViewStyleGrouped];
    if (self) {
        UINavigationItem *i = [self navigationItem];
        [i setTitle:@"Task List"];
        [[i title] uppercaseString];
        UIBarButtonItem *bbi = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addCell:)];
        [[self navigationItem] setRightBarButtonItem:bbi];
        [self.tableView setSeparatorColor:[UIColor colorWithRed:26.0/255 green:188.0/255 blue:156.0/255 alpha:1.0f]];
        [self.tableView setBackgroundView:nil];
        [self.tableView setBackgroundColor:[UIColor colorWithRed:26.0/255 green:188.0/255 blue:156.0/255 alpha:1.0f]];
    }
    return self;
}
- (id) initWithStyle:(UITableViewStyle)style{
    return [self init];
}
-(void) viewDidLoad{
    FMMoveTableView *mtc = [[FMMoveTableView alloc]init];
    [mtc setDataSource:self];
    [self.tableView setDelegate:self];
    taskArray = [[NSMutableArray alloc] init];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
    if (!cell)
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"UITableViewCell"];
    NSString *detailText = [NSString stringWithFormat:@"%.0f", [[taskArray objectAtIndex:[indexPath row]] timeInterval]];

    [[cell textLabel] setText:[[taskArray objectAtIndex:[indexPath row]] taskName]];
    cell.textLabel.text = [[[taskArray objectAtIndex:[indexPath row]] taskName] uppercaseString];
    [[cell textLabel] setFont:[UIFont fontWithName:@"AvenirNext-DemiBold" size:15]];
    [cell setBackgroundColor:[UIColor colorWithRed:236.0/255 green:240.0/255 blue:241.0/255 alpha:1.0f]];
    cell.textLabel.textColor = [UIColor colorWithRed:26.0/255 green:188.0/255 blue:156.0/255 alpha:1.0f];

    [[cell detailTextLabel] setText:detailText];
    [[cell detailTextLabel] setFont:[UIFont fontWithName:@"Avenir-Black" size:16]];
    return cell;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [taskArray count];
}
-(IBAction)addCell:(id)sender{
    Properties2ViewController *pvc = [[Properties2ViewController alloc]init];
    [pvc setDelegate:self];
    [self presentViewController:pvc animated:YES completion:NULL];
}
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [[self tableView] reloadData];
    }
-(void)properties2ViewControllerDidEnterPropertiesSuccesfully:(Tasks *)t{
    if (![[t taskName] isEqual: @""]) {
    [taskArray addObject:t];
    }
    [self.tableView reloadData];
}
-(void)moveTableView:(FMMoveTableView *)tableView moveRowFromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath{
    [tableView moveRowAtIndexPath:fromIndexPath toIndexPath:toIndexPath];
    [tableView reloadData];
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    Tasks *task = [taskArray objectAtIndex:[indexPath row]];
    DetailViewController *dvc = [[DetailViewController alloc]init];
    [dvc setTestTask:task];
    [[self navigationController] pushViewController:dvc animated:YES];
   // PKRevealController *pkrc = [[PKRevealController alloc]initWithFrontViewController:self rightViewController:dvc options:nil];
    //[pkrc showViewController:dvc animated:YES completion:NULL];

}
-(void)loadView{
    [super loadView];
}
@end

2 个答案:

答案 0 :(得分:0)

如果您自己实例化UITableView,请改为实例化库类。例如,如果你这样说:

UITableView *tableView = [[UITableView alloc] initWithFrame:frame
    style: UITableViewStylePlain];

然后改为:

LibraryTableView *tableView = [[LibraryTableView alloc] initWithFrame:frame
    style:UITableViewStylePlain];

如果LibraryTableView提供了一些其他更专业的initWith…方法,则可能需要使用该方法。

如果要在属性或实例变量中存储对表视图的引用,您可能还希望将该属性或实例变量的类型从UITableView *更改为LibraryTableView *

更新

我相信如果您使用UITableViewController,您可以创建自己的表格视图并将其分配给控制器的tableView属性:

UITableViewController *tvc = ...;
tvc.tableView = [[LibraryTableView alloc] initWithFrame:frame
    style:UITableViewStylePlain];

更新2

viewDidLoad中,您正在创建FMMoveTableView,但您并未将其存储在视图控制器的tableView属性中。您必须将其存储在视图控制器的tableView属性中,当您这样做时,视图控制器将自动设置表视图的dataSource和{ {1}}至delegate

self

-(void) viewDidLoad{ self.tableView = [[FMMoveTableView alloc] init]; taskArray = [[NSMutableArray alloc] init]; } 中,您需要实例化tableView:cellForRowAtIndexPath:,而不是FMMoveTableViewCell。您将UITableViewCell消息发送到要实例化的类:

alloc

如果您有自己的- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; if (!cell) { cell = [[FMMoveTableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"Cell"]; } // etc. 自定义子类,请改为实例化。

答案 1 :(得分:0)

我之前创建了自定义TableViewCells,您可以像创建viewControllers一样创建自定义类(File&gt; New&gt; File)。选择要子类的对象时,请选择UITableViewCell。

不幸的是,Xcode不会为您提供包含.xib文件的选项,因此您还必须创建其中一个文件:文件&gt;新&gt;文件,但这次弹出窗口的左侧,选择“用户界面”而不是“Cocoa Touch”。在此屏幕上选择“清空”图标。

系统将询问您的设备系列是iPhone还是iPad。由于您正在创建一个表视图单元而不是一个viewController,因此您选择哪个并不重要。

创建此对象时,将显示空白画布。将“表视图单元格”从对象库拖到画布上,然后设置为开始创建!

值得注意的是,在通常创建插座的地方,您应该为TableViewCells创建属性。这是因为其他对象将与TableViewCell进行交互,而不仅仅是TableViewCell的实现文件。

以下是自定义TableViewCell的头文件:

@interface MyCustomCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UIImageView *icon;
@property (weak, nonatomic) IBOutlet UILabel *label;
@property (weak, nonatomic) IBOutlet UILabel *number;

@end

我的实施文件是空的。

然而,并非全部。 TableViewController中还有一些工作要使用这个单元格。请务必导入TableViewCell的头文件。

首先,必须在viewDidLoad方法中注册单元格

// Resiter the Nib
UINib *nib = [UINib nibWithNibName:@"MyCustomCell" bundle:nil];
[[self tableView] registerNib:nib forCellReuseIdentifier:@"MyCustomCell"];

然后当TableViewController确定如何绘制单元格时:

- (UITableViewCell *) tableView:(UITableView *)tableView
      cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCustomCell"]

    // Then here you can set the properties of each cell
    [[cell label] setText:@"Some text here"];

    [[cell number] setText:[NSString stringWithFormat:@"%d", 5]];

    [[cell icon] setImage:[UIImage imageNamed:@"myImage]];
}

我希望这有用!