将UITableViewController转换为UITable VIew对象

时间:2011-03-21 04:43:49

标签: iphone objective-c user-interface mobile

我目前在UITableViewController NIB中有一个NSArray加载值。我意识到我想在我的视图中使用一个表和其他对象,例如标签和按钮等。因此我需要在我的UIView中使用UITableView对象。

对此进行编码的正确方法是什么?我可以将方法从当前的TabeViewController类复制到我的UIView类吗?

#import "LogTableViewController.h"


@implementation LogTableViewController
@synthesize logArray;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

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

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];

    logArray = [[NSArray alloc]initWithObjects:@"Today's Workout", @"Last Workout", @"Past Week", @"Past Month", @"All Workouts", nil];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
#warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.
    // Return the number of rows in the section.
    return [logArray count];
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...

    cell.textLabel.text = [logArray objectAtIndex:indexPath.row];

    return cell;
    }

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
    /*
     <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
     [self.navigationController pushViewController:detailViewController animated:YES];
     [detailViewController release];
     */
}

@end

3 个答案:

答案 0 :(得分:4)

<强> STEP-1

在.h(标题文件)中,更改

@interface <viewControllername>:UITableViewController

@interface <viewControllername>:UIViewController

<强> STEP-2:

在您的XIB中,删除tableView作为主视图,并从库中添加UIView。将文件所有者的view插座连接到该UIView。

现在您可以将ViewController用作普通的UIViewController类。

立即向View添加tableView并给出其尺寸。

此外,您现在需要将一个插座添加到tableView,因为它不再是UITableViewController而是UIViewController。也不要忘记将表格的datasourcedelegate连接与文件所有者

相关联

现在,您可以轻松地将其他控件放在tableView旁边。

希望这会对你有所帮助。

答案 1 :(得分:2)

如果我理解你的问题,听起来你现在有一个UITableViewController子类,你想把它改成UIViewController子类。

为了做到这一点,你需要做一些事情,希望我不会忘记任何步骤。

首先在@interface文件中,更改类的超类,符合数据源并委托协议,最后声明UITableView的出口:

@interface YourViewControllerName : UIViewController <UITableViewDataSource, UITableViewDelegate>
{
}
@property (nonatomic, retain) IBOutlet UITableView *myTableView;

转到你的实现文件并@synthesize tableView属性:

@implementaion YourViewControllerName
@synthesize myTableView;

如果您以编程方式创建视图控制器并在初始化期间进行任何自定义,则还需要更改指定的初始化程序(对于您而言,似乎并非如此,因为您提到了NIB文件,但在此处它是反正):

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

从旧视图控制器复制表视图委托和数据源方法,以及(NSArray *)数据源的任何自定义初始化代码。这通常是在viewDidLoad:方法中创建的。

转到NIB文件(仅包含tableview对象的文件)。将UIView对象添加到nib并将表视图对象作为其子视图移动。

通过从文件所有者拖动到相应的对象,将UIView连接到文件所有者的视图插座,将UITableView连接到文件所有者的myTableView插座。使文件所有者成为tableview数据源并委托,但控制从tableview拖动到文件所有者。

除非我忘了什么,否则应该就是你需要做的一切。

随意在评论部分提出任何问题。

干杯,

罗格

答案 2 :(得分:1)

Parth上面的答案很棒 - 但我必须在我的代码中再做一件事。

当您从UITableViewController更改为UIViewController时,您失去的一件事就是财产clearsSelectionOnViewWillAppear。所以我添加了viewDidAppear的实现,如下所示:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    NSArray *selectedRows = [self.tableView indexPathsForSelectedRows];
    if (selectedRows) {
        for (NSIndexPath *selectedPath in selectedRows) {
            [self.tableView deselectRowAtIndexPath:selectedPath animated:NO];
        }
    }
}