【问题标题】:How to use generate UITableView for other UIViewController?如何为其他 UIViewController 使用生成 UITableView?
【发布时间】:2014-12-16 12:42:48
【问题描述】:

我正在尝试在我的UIViewController 中使用生成的UITableView

这就是我尝试生成的方式:-

TableViewGeneratorController.h

#import <UIKit/UIKit.h>

@interface TableViewGeneratorController : UITableViewController<UITableViewDataSource,UITableViewDelegate>
@property(nonatomic,retain) UITableView *tableView;
    - (UITableView *)getTableView;
@end 

TableViewGeneratorController.m

#import "TableViewGeneratorController.h"

@interface TableViewGeneratorController (){
}
@end

@implementation TableViewGeneratorController
@synthesize tableView;

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (id)initWithNibName:(NSString )nibNameOrNil bundle:(NSBundle )nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self){
        self.tableView = [[UITableView alloc]initWithFrame:CGRectMake(10, 80, 300, 400)];
        tableView.delegate = self;
        tableView.dataSource = self;
        tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
        [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
    }

    return self;
}

- (UITableView *)getTableView
{
    return self.tableView;
}


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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return 20;
}

- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *cellIndentifier = @"Cell";
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellIndentifier];
    if (cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIndentifier];
    }
    cell.textLabel.text = @"Yes";
    return cell;

}

@end

现在在我的 UIViewController 中,我调用 getTableView 并将 UITableView 添加为子视图,但我遇到了异常:-

ViewController.m

TableViewGeneratorController *tableViewGeneratorController = [[TableViewGeneratorController alloc]init];

UITableView *tableView = [tableViewGeneratorController getTableView];

[self.view addSubview: tableView ];

例外:-

* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[_UIAppearanceCustomizableClassInfo numberOfSectionsInTableView(inlove): 无法识别的选择器发送到实例 0x7b1ba7e0” * 首先抛出调用栈:

【问题讨论】:

  • 如何覆盖-(id)init 方法并通过那里的所有初始化代码.. 或者你只需​​调用[[TableViewGeneratorController alloc]initWithNibName:nil bundle:nil]; 试试这个

标签: ios objective-c uitableview


【解决方案1】:

您应该在您的init 函数中生成任何控件。 init 函数仅用于逻辑初始化(例如将 bool 设置为 YES)。将您的餐桌代码移至viewDidLoad

这通常会抛出错误,因为视图还没有准备好。

【讨论】:

  • viewDidLoad 在这个 TableViewGeneratorController *tableViewGeneratorController = [[TableViewGeneratorController alloc]init] 之后没有被调用;
  • 问题是您只需要使用生成器创建一个tableview,当您获得tableview 时,您应该将delegate 设置为您将其添加为子视图的视图控制器。
  • @AdeelUrRehman 我也这么想。但无法将委托设置为视图控制器。能否请您发布一个答案。
  • @KousikChowdhury 让我为你做这些
  • @KousikChowdhury 刚刚发布了答案。如果您有任何问题,请告诉我
【解决方案2】:

TableViewGeneratorController.h

@interface TableViewGeneratorController : UIViewController

@property(nonatomic, strong) UITableView *tableView;

- (id)initWithNibName:(NSString )nibNameOrNil bundle:(NSBundle )nibBundleOrNil frame:(CGRect)frame;
- (UITableView *)getTableView;

@end

TableViewGeneratorController.m

@implementation TableViewGeneratorController
@synthesize tableView = _tableView;

- (id)initWithNibName:(NSString )nibNameOrNil bundle:(NSBundle )nibBundleOrNil frame:(CGRect)frame
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self)
    {
        _tableView = [[UITableView alloc]initWithFrame:frame];
        _tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
        [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
    }
    return self;
}

- (UITableView *)getTableView
{
    return _tableView;
}

@end

ViewController.m

TableViewGeneratorController *tableViewGeneratorController = [[TableViewGeneratorController alloc] init];
UITableView *tableView = [tableViewGeneratorController getTableView];
tableView.delegate = self;
tableView.dataSource = self;
[self.view addSubview:tableView];
[tableView reloadData];

在 ViewController.m 中实现表视图委托

【讨论】:

  • @KousikChowdhury 实际问题在哪里?您能否再解释一下,以便我能够修复它。
  • initTableViewWithFrame 被多次调用。如果我删除 - (void)initTableViewWithFrame:(CGRect)frame;然后停止但得到同样的错误。实际上,没有从 ViewController 调用 numberOfRowsInSection。怎么称呼>
  • @KousikChowdhury 对不起我的错。我只是编辑帖子。请查看并重试。而不是- (void)initTableViewWithFrame:(CGRect)frame,它应该是- (id)initTableViewWithFrame:(CGRect)frame
  • 不,同样的事情正在发生,一次又一次地进入 initWithNibName 块。
  • @KousikChowdhury 更新了帖子中的功能,请重试并告诉我。
【解决方案3】:

如果您使用 init() 初始化 tableViewGeneratorController,则永远不会调用 initWithNibName()

【讨论】:

  • BTW initwithnib 被调用,我也得到了 tableView。但由于选择行而失败。因为它不在 ViewController 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多