有一个UIViewController
由UITextField
和UITableView
组成。我有一个单独的UIViewTableViewController
子类,用于支持UITableView
中UIViewController
的委派和数据源(默认)。我可以将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
答案 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
。