如何以编程方式声明和显示我的 UITableView? [关闭]

Posted

技术标签:

【中文标题】如何以编程方式声明和显示我的 UITableView? [关闭]【英文标题】:How to declare & display my UITableView programmatically? [closed] 【发布时间】:2013-07-27 02:33:59 【问题描述】:

我用所有细节重新更新我的问题,以便更好地理解!

正如他们所说的图片胜于雄辩,我给你做了一个小模型来详细解释一切!

首先,我用文字解释。

我有这个:

1 MasterViewController = (RootViewController) 1 FirstView = UITableView(将显示许多带有数据的自定义单元格) 2 SecondView = UIView 3 第三视图 = UIView

现在的图像/模型:

在我的 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];

【问题讨论】:

为什么要继承 UITableView?我认为没有必要。 我是新手,我也不太明白你的问题的意思!我倾向于回答我需要创建我的 UITableView,对吗? 啊,明白了。你的代码肯定反映了一个新手。它有太多错误,无法在这里有效地解决它。没关系,它伴随着作为一个新手。随着时间的推移和毅力,我相信你会学会的。我建议你通过这个UITableView tutorial。 你有什么入门书籍吗?您是编程新手吗? Stack Overflow 的目的恰恰是为了“新手学习”;人们可以提出并回答有关编程的重点具体的问题,这些问题可以在这里以与未来用户相关的方式得到完整的回答。 【参考方案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;

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

【讨论】:

好的,谢谢,可以直接在我的 MyTableView.h 和 MyTableView.m 中完成吗? 你可以,但你不应该。它违背了 MVC 模式,因为它暗示视图知道如何检索数据,这是控制器类型类的任务。如果你想让你的代码保持整洁,我可以给你一个建议,但是评论它可能太长了 好的,谢谢!我用我已经实现和工作的新代码更新了我的帖子,但正如你所说,我认为代码一定很糟糕! 通过在 ios 上观看 Paul Hegarty 的 introduction to the MVC design pattern,您将为自己创造一个美好的世界(实际上是观看整个系列)。【参考方案2】:

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

让我简要地向您解释一下应该如何使用表视图。这里有三个主要组件:

    UITableView 是 MVC 模式中的 视图,它唯一的工作是呈现数据,并且相对于它的内容偏移量来呈现数据,并且它通过设置一定数量的单元格来实现它当它们离开屏幕时入队,并在它们应该显示时出队。如果你注意的话,UITableView 继承自UIScrollView,所以它所做的就是通过拥有一个可重用的单元格系统来扩展滚动机制,允许它使用最少量的单元格。 UITableViewCell 负责表示应用程序中的单个数据。它也是 MVC 模式中 视图 的一部分。 现在,UITableView 需要从某个地方获取其数据,有两种可能性,您可以:
      子类 a UITableViewController。 让另一个类按照UITableViewDataSource填写数据。

任你选择,现在填充数据的类将成为 MVC 模式中的 控制器(模型完全由你决定,可以是一个简单的字符串数组,与表格视图一样多)。

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

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

总而言之,如果您只需要更改它将显示的数据,则永远不必对表格视图进行子类化。

回答你的问题...

使用笔尖

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

但是现在,让我们让它在MasterViewController 中运行。在您的MasterViewController xib 文件中,有一个没有子类化的普通 UITableView。确保MasterViewController 符合&lt;UITableViewDataSource&gt;,然后将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,您可以这样做:

如果您正在处理一个非常复杂的视图,并且所有额外的tableView:didFart:andSmelledNice: 代码会妨碍您,这将非常有用。你显然是通过代码来做的,但我不会这么说,把它当作你对离开笔尖方式的惩罚。

【讨论】:

Waouhhhhhh,这就是响应!!!非常感谢您的回复!请检查,我已经完全用更多细节重新更新了我的问题! @GilbertOOl 吉尔伯特,这是您第三次更新您的问题,每次您提出不同的问题。 SO 的部分想法是,当一个问题得到回答时,你解决它,关闭它,然后,如果你有另一个疑问,发布另一个问题。这个问题已经发生了如此大的变化,以至于现在没有任何答案是有意义的。您最初的问题似乎是针对如何制作 UITableViews,现在您希望我们构建一个特定的布局。 不,抱歉,问题仍然存在,它只涉及 UITableView 离开!唯一改变的是,我忘记指定 UITableView 没有填满整个屏幕,但这部分代码是我的问题!【参考方案3】:

如果你的 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

【讨论】:

非常感谢您的回复!请检查,我已经完全用更多细节重新更新了我的问题! 是的,当然,我会立即执行,但要精确,FirstView 不是控制器,只是一个简单的 UIView! 如果是 UIView 则只需添加 @Class UIViewController;在头文件中。 我已经重新更新了我的帖子,请检查此代码 有时您会说您的第一个视图是 UIView,而您将 firstview 显示为 UITableView。

以上是关于如何以编程方式声明和显示我的 UITableView? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式从 iPad 3 访问和显示文档?

在我的情况下,如何以编程方式在另一个上面显示一个布局?

如何以编程方式在 Dijit 对话框中制作和显示表单?

如何在显示旋转时以编程方式更改布局约束

以编程方式创建和显示 ProgressBar

UICollectionViewCell 的动态高度以编程方式与约束?