如何申报&以编程方式显示我的UITableView?

时间:2013-07-27 02:33:59

标签: ios uitableview

我完全更新了我的问题以及更多理解的所有细节!

正如他们所说的那样,图片说的不仅仅是文字,我给你做了一个小模型来详细解释一切!

首先,我在文中解释。

我有这个:

  • 1 MasterViewController =(RootViewController)
  • 1 FirstView = UITableView(将显示许多带数据的自定义单元格)
  • 2 SecondView = UIView
  • 3 ThirdView = UIView

现在image / mockup:

my mockup for my problem

在我的MasterViewController.h(代码的一部分)

@property (strong, nonatomic) FirstView *firstView;
@property (strong, nonatomic) SecondView *secondView;
@property (strong, nonatomic) ThirdView *thirdView;

在我的MasterViewController.m(代码的一部分)

        firstView = [[LastSalesView alloc] initWithFrame:CGRectMake(0.0, 0.0, result.width, result.height)];
        firstView.backgroundColor = [UIColor clearColor];
        firstView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        [bottomContainerView addSubview:firstView];
        [firstView setHidden:NO];

        secondView = [[LastSalesView alloc] initWithFrame:CGRectMake(0.0, 0.0, result.width, result.height)];
        secondView.backgroundColor = [UIColor clearColor];
        secondView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        [bottomContainerView addSubview:secondView];
        [secondView setHidden:NO];


        thirdView = [[LastSalesView alloc] initWithFrame:CGRectMake(0.0, 0.0, result.width, result.height)];
        thirdView.backgroundColor = [UIColor clearColor];
        thirdView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        [bottomContainerView addSubview:thirdView];
        [thirdView setHidden:NO];



-(void)viewFirstPage:(id)sender {
    NSLog(@"button first pushed");
    [firstView setHidden:NO];
    [secondView setHidden:YES];
    [thirdView setHidden:YES];
}

-(void)viewSecondPage:(id)sender {
    NSLog(@"button second pushed");
    [firstView setHidden:YES];
    [secondView setHidden:NO];
    [thirdView setHidden:YES];
}

-(void)viewThirdPage:(id)sender {
    NSLog(@"button third pushed");
    [firstView setHidden:YES];
    [secondView setHidden:YES];
    [thirdView setHidden:NO];
}

3 个答案:

答案 0 :(得分:1)

您询问的UITableViewDataSource方法通常属于视图控制器。实际上,您的MasterViewController类已经声明它实现了UITableViewDataSource协议:

@interface MasterViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

因此,当您在MasterViewController中创建表视图时,视图控制器将需要告诉表视图它是数据源(和委托):

myTableView = [[MyTableView alloc] initWithFrame:CGRectMake(0.0, 0.0, result.width, result.height)];
myTableView.dataSource = self;
myTableView.delegate = self;

这应该让你走上正确的道路。

答案 1 :(得分:1)

免责声明 这个答案是在OP更新他的帖子之前给出的,原来的问题几乎就是“我如何使用表格视图?”,现在它有了变成完全不同的东西。我的回答可能对某人有价值。

让我简单地向您解释如何使用表格视图。这里有三个主要组成部分:

  1. UITableView是MVC模式中的视图,它唯一的工作是呈现数据,并且相对于其内容偏移量这样做,并且通过设置它来实现当它们离开屏幕时它排队的细胞数量,并在它们应该被显示时将它们出列。如果你注意,UITableView继承自UIScrollView,所以它所做的就是通过一个可重复使用的单元系统扩展滚动机制,允许它使用最少量的单元格。
  2. UITableViewCell负责代表应用内的单个数据。它也是MVC模式中视图的一部分。
  3. 现在,UITableView需要从某个地方获取数据,有两种可能性,要么你:
    1. 子类UITableViewController
    2. 让另一个班级符合UITableViewDataSource
    3. 填写数据
  4. 您选择的任一选项,现在将填充数据的类将成为MVC模式中的控制器(该模型完全取决于您,可能是一个简单的字符串数组,和表格视图一样多。)

    UITableView期望为他填充(或创建)单元格。这是一个重要的区别:

    • 在iOS 4.x和之前的版本中,您必须编写自己的单元格创建,这有点奇怪,因为它会违背MVC模式。
    • 在iOS 5中引入了registerNib:forCellReuseIdentifier:registerClass:forCellReuseIdentifier:方法,您不再需要创建自己的单元格创建,它会自动检查是否需要更多单元格,并根据需要实例化它们。

    所有事情都说,如果您只需要更改它将显示的数据,就不应该对表视图进行子类化。

    回答你的问题......

    使用Nibs

    完全取决于你认为谁应该是委托,你甚至可以有一个单独的对象来控制tableview中的数据。

    但是现在,让它在MasterViewController中运行。在MasterViewController xib文件中,有一个没有子类的普通UITableView。确保MasterViewController符合<UITableViewDataSource>,然后将tableview dataSource插座连接到MasterViewController(文件所有者,最有可能)。

    唯一重要的两个方法是-tableView:cellForRowAtIndexPath:-tableView:numberOfRowsInSection:,实现这些方法,并且你的tableView可以正常工作。

    高度,编辑和其他所有内容都是UITableViewDelegate协议的一部分,如果你关心这些,请重复上述步骤,但是delegate出口。

    按代码

    我不明白为什么人们如此讨厌笔尖,但是......无论如何,让它在MasterViewController上运行。

    <强> MasterViewController.m

    #include "MasterViewController.h"
    #include "MyCell.h"
    
    @interface MasterViewController <UITableViewDataSource, UITableViewDelegate>
    @property (nonatomic,weak) UITableView *tableView;
    @end
    
    @implementation MasterViewController
    
    - (void)viewDidLoad
    {
        // Notice that this method only gets called if you're using a nib
        // If you plan of getting rid of nibs ENTIRELY, use -loadView
        [super viewDidLoad];
    
        UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
        tableView.dataSource = self;
        tableView.delegate   = self;
        [self.view addSubview:tableView];
    
        // Save a reference to it
        self.tableView = tableView;
    
        // iOS 5+
        [tableView registerClass:[MyCell class] forCellReuseIdentifier:@"cell.something"];
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return 10;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // Again, iOS 5+
        MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell.something" forIndexPath:indexPath];
    
        cell.textLabel.text = @"Hello world!";        
    
        return cell;
    }
    
    @end
    

    复杂视图的提示

    此外,我的印象是您不希望MasterViewController处理与表视图数据相关的代码。因为它是一个代表,你可以把它指向你想要的任何东西!删除符合所述协议的NSObject,您只需执行此操作:

    Hot IBOutlet action

    如果您正在处理非常复杂的视图,并且所有额外的tableView:didFart:andSmelledNice:代码都会受到阻碍,那么非常有用。你显然是靠代码来做的,但是我不会这样做,认为这是你离开笔尖的方式的惩罚。

答案 2 :(得分:0)

如果你的View UITableView那么你可以像这样使用---

MyFirstView.h

#import <UIKit/UIKit.h>

@class UIViewController;

@interface MyFirstView : UITableView<UITableViewDelegate,UITableViewDataSource>

@end

MyFirstView.m

#import "MyFirstView.h"

@implementation MyFirstView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.delegate=self;
        self.dataSource=self;
        // Initialization code
    }
    return self;
}

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *mycell=[tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];

    if (mycell==nil) {
        mycell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellIdentifier"];
    }

    mycell.textLabel.text=@"My super view is tableView.";
    return mycell;
}

@end

将这些UITableView文件用作

MyFirstView *tblView=[[MyFirstView alloc] init];
[tblView setFrame:CGRectMake(0, 0, 320, 300)];

[self.view addSubview:tblView];

如果仍然不理解read this