-4

我用所有细节重新完全更新我的问题,以获得更多理解!

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

首先,我用文字解释。

我有这个 :

  • 1 MasterViewController = (RootViewController)
  • 1 FirstView = UITableView(将显示许多带有数据的自定义单元格)
  • 2 第二视图 = 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];
}
4

3 回答 3

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;

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

于 2013-07-27T03:33:03.477 回答
1

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

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

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

无论您选择哪种选择,现在填充数据的类都将成为 MVC 模式中的控制器(模型完全取决于您,可以是一个简单的字符串数组,与表视图一样)。

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

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

综上所述,如果您只需要更改它将显示的数据,则永远不必对表视图进行子类化。

要回答你的问题...

使用笔尖

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

但是现在,让我们让它运行在MasterViewController. 在您的MasterViewControllerxib 文件中,有一个没有子类化的普通 UITableView。确保MasterViewController符合<UITableViewDataSource>然后将 tableviewdataSource出口连接到MasterViewController(最有可能是文件所有者的)。

唯一重要的两种方法是-tableView:cellForRowAtIndexPath:and -tableView:numberOfRowsInSection:,实现这些方法,并且您的 tableView 应该可以工作。

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

按代码

我不明白为什么人们这么讨厌笔尖,但是.. 不管怎样,让我们​​让它在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符合上述协议的,你可以简单地这样做:

热门 IBOutlet 动作

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

于 2013-07-27T04:16:49.990 回答
0

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

我的第一视图.h

#import <UIKit/UIKit.h>

@class UIViewController;

@interface MyFirstView : UITableView<UITableViewDelegate,UITableViewDataSource>

@end

我的第一视图.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];

如果还是不明白,请阅读本文

于 2013-07-27T05:36:40.660 回答