1

我有一个 UITableViewController 类,我称之为“MasterViewController”。在 MasterViewController 中,我想显示一个使用不同 UITableViewController(不是 MasterViewController)的 tableview。我这样做是因为另一个 tableview 已经使用 MasterViewController 作为它的委托和数据源。

我在 MasterViewController 的方法中有以下逻辑;

ToTableViewController *toController = [[ToTableViewController alloc] init];
UIView *toView = [[UIView alloc] initWithFrame:CGRectMake(10,10,250,200)];
//toView.backgroundColor = [UIColor redColor];
UITableView *toTableView = [[UITableView alloc] initWithFrame:CGRectMake(10,10,220,180) style:UITableViewStylePlain];

[toTableView setDelegate:toController];
[toTableView setDataSource:toController];

[toView addSubview:toTableView];

[self.view addSubview:toView];

[toTableView reloadData];

我希望 ToTableViewController 成为这个新 tableview (toTableView) 的委托和数据源。

问题是我的 ToTableViewController cellForRowAtIndexPath 方法没有被调用。事实上,没有调用任何委托方法。

对于任何反馈,我们都表示感谢。

蒂姆

4

1 回答 1

0

我很确定您的问题是toController发布得太早了。使用 ARC(我假设您也是),我按照您的尝试使用它。我得到了相同的结果,委托方法似乎没有被调用。解决的方法是不为toController. 而是将其声明为 MasterViewController 类的成员,例如

@property (strong, nonatomic) ToTableViewController *toController; 

然后在代码中使用变量名_toController来引用它。

编辑:为了在我的第一个测试中清楚,我有 ToTableViewController 从 UITableViewController 继承。因为这样我真的不需要添加 UITableView 你正在创建和附加委托(你可以直接使用 _toController.view )所以在第二个测试中我从头开始创建了一个 ToTableViewController 继承自委托协议,其中单独的UITableView 变得很有必要。只是为了完整起见,这里是有效的代码:

ToTableViewController.h

#import <Foundation/Foundation.h>

@interface ToTableViewController : NSObject <UITableViewDelegate, UITableViewDataSource>

@end

ToTableViewController.m

#import "ToTableViewController.h"

@implementation ToTableViewController

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

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

- (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];
    }

    NSString *str1 = @"Row #";
    cell.textLabel.text = [str1 stringByAppendingFormat:@"%d", indexPath.row+1];

    return cell;
}

@end

MasterViewController.m(我在 .m 文件中声明了 toController ,如图所示,但可以在 .h 文件中这样做......)

#import "MasterViewController.h"
#import "ToTableViewController.h"

@interface MasterViewController ()

@property (strong, nonatomic) ToTableViewController *toController;

@end

@implementation MasterViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    _toController = [[ToTableViewController alloc] init];
    UIView *toView = [[UIView alloc] initWithFrame:CGRectMake(10,10,250,200)];
    toView.backgroundColor = [UIColor redColor];

    UITableView *toTableView = [[UITableView alloc] initWithFrame:CGRectMake(10,10,220,180) style:UITableViewStylePlain];

    [toTableView setDelegate:_toController];
    [toTableView setDataSource:_toController];

    [toView addSubview:toTableView];

    [self.view addSubview:toView];
}

@end
于 2013-04-02T02:10:48.293 回答