[ios]UITableViewController 委托

发布时间: 2017/3/21 23:08:45
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一个 UITableViewController 类,我称之为"MasterViewController"。 从内 MasterViewController 我想要显示表使用不同的 UITableViewController (不是 MasterViewController)。我做这另一个表是已使用 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 要委托和这个新表 (toTableView) 的数据源。

问题是我的 ToTableViewController cellForRowAtIndexPath 方法未被调用。事实上,被称为无委托方法。

任何反馈意见将不胜感激。

蒂姆 ·

解决方法 1:

很确信你的问题是, toController 被过早释放。使用的ARC (我假设你也是),我玩了它之后你正在 todo。 我得到同样的结果在哪里委托方法似乎不会被调用。什么解决它就是不使用一个本地变量 toController 。而是将它声明为 MasterViewController 类的成员

@property (strong, nonatomic) ToTableViewController *toController; 

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

编辑︰ 只是要明确在我第一次测试过 ToTableViewController UITableViewController 继承。因为这样我真的不需要添加 UITableView 您创建和附加代表太 (你可能只是使用 _toController.view 直接) 等等我从头从委托Protocol单独 UITableView 成为必要继承创建 ToTableViewController 这第二次测试。只是为了完整性,这里是工作的代码︰

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
赞助商