如何为委托和数据源加载具有单独子类的UITableView?

时间:2015-10-08 11:10:11

标签: ios objective-c iphone uitableview uiviewcontroller

有一个UIViewControllerUITextFieldUITableView组成。我有一个单独的UIViewTableViewController子类,用于支持UITableViewUIViewController的委派和数据源(默认)。我可以将UITexField中的文本导入SecondViewController并将其保存到NSMutableArray,但这不会传递给UITableView。如果我只是将一个字符串传递给* cell,它会显示在UITableView中。 这是代码:

ViewController.h

    #import <UIKit/UIKit.h>
    #import "SecondTableViewController.h"

    @interface ViewController : UIViewController{
        SecondTableViewController *tableController;
    }
    @end

**ViewController.m**

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITableView *table;
@property (weak, nonatomic) IBOutlet UITextField *textField;

@end

@implementation ViewController



- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    tableController = [[SecondTableViewController alloc] init];
    tableController.taskArray = [[NSMutableArray alloc]init];

    self.table.dataSource = tableController;
    self.table.delegate = tableController;
    self.textField.delegate = tableController;

}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

SecondTableViewController.h

#import <UIKit/UIKit.h>


@interface SecondTableViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate>

@property NSMutableArray *taskArray;
@property NSString *taskString;


@end

SecondViewController.m

#import "SecondTableViewController.h"
#import "ViewController.h"

@implementation SecondTableViewController


-(BOOL)textFieldShouldReturn:(UITextField *)textField {
    self.taskString = [textField text];
    [textField resignFirstResponder];
    return YES;
}

-(void)textFieldDidEndEditing:(UITextField *)textField {

    [self.taskArray addObject:self.taskString];
    [textField setText:@""];
    NSLog(@"array is %@", self.taskArray);
    [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:self
                                             .self.taskArray.count-1 inSection:0]] withRowAnimation:
    UITableViewRowAnimationLeft];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.taskArray.count;
    }

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

            if (cell == nil) {
                cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
                }
        cell.textLabel.text = self.taskArray[indexPath.row];
    NSLog(@"cell ident %@", self.taskArray[indexPath.row]);

    return cell;
}




@end

2 个答案:

答案 0 :(得分:1)

您对SecondTableViewController中的tableView的引用并未指向您在原始UIViewController中创建的tableView var,因此cellForRowAtIndexPath不会对该tableView var执行任何操作。

TableViewController类有一个名为tableView的属性,该属性已绑定到类,并引用其父级,然后该类是委托和数据源。您已断开与委托和数据源的链接,但未断开与tableView属性本身的链接。

如果要将委托和数据源与tableview所在的类分开,那么您可以这样做但不需要使用UITableViewController类。您可以创建一个自定义类,为NSObject创建子类,并在其中包含所有这些委托和数据源调用。如果你这样做,那么用于设置tableView的委托和数据源的代码将如下所示

 SeparateDataSourceClass *separateClass = [SeparateDataSourceClass new];
 self.table.dataSource = separateClass;
 self.table.delegate = separateClass;
 self.textField.delegate = separateClass;

这样的事情,但你可能会得到这个想法。

答案 1 :(得分:0)

我不确定你为什么这样做。我的意思是View Controller 2正在控制View Controller 1的外观!你不是这样做的!

但是,您的问题是self.tableView中的SecondTableViewController不是您为其设置委托的表格视图。 self.tableView中的SecondTableViewController是作为UITableViewController的子类获取的默认表格视图。

要解决此问题,有几种解决方案:

解决方案1:摆脱这个混乱的视图层次结构并拥有相同的视图控制器     管理这些东西。

解决方案2:在右表视图对象上调用insertRowsAtIndexPaths。为此,您可以将tableView引用从ViewController传递到SecondTableViewController