Ios 如何为委托和数据源加载具有单独子类的UITableView?
有一个Ios 如何为委托和数据源加载具有单独子类的UITableView?,ios,objective-c,iphone,uitableview,uiviewcontroller,Ios,Objective C,Iphone,Uitableview,Uiviewcontroller,有一个UIViewController由UITextField和UITableView组成。我有一个独立的UIViewTableViewController子类,用于支持UIViewController中UITableView的委派和数据源(默认)。我可以将UITexField中的文本保存到SecondViewController中,并将其保存到NSMutableArray,但这不会传递到UITableView。如果我只是将一个字符串传递给*单元格,它将显示在UITableView中。 代码如下
UIViewController
由UITextField
和UITableView
组成。我有一个独立的UIViewTableViewController
子类,用于支持UIViewController
中UITableView
的委派和数据源(默认)。我可以将UITexField
中的文本保存到SecondViewController中,并将其保存到NSMutableArray
,但这不会传递到UITableView
。如果我只是将一个字符串传递给*单元格,它将显示在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
#import <UIKit/UIKit.h>
@interface SecondTableViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate>
@property NSMutableArray *taskArray;
@property NSString *taskString;
@end
我不知道你为什么这样做。我的意思是视图控制器2控制着视图控制器1的外观!!!你不能这样做 但是,您的问题是,
SecondTableViewController
中的self.tableView
不是您为其设置为委托的表视图self.SecondTableViewController
中的tableView
是作为UITableViewController
的子类而获得的默认表格视图
要解决此问题,有两种解决方案:
解决方案1:摆脱这种混乱的视图层次结构,使用相同的视图控制器
管理这些东西
解决方案2:在右表视图对象上调用
insertRowsAtIndexPaths
。为此,您可以将tableView
引用从ViewController
传递到SecondTableViewController
您在SecondTableViewController中对tableView的引用没有指向您在原始UIViewController中创建的tableView
变量,因此cellforrowatinexpath不会对其进行任何操作那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;
像这样的,但你可能知道
SeparateDataSourceClass *separateClass = [SeparateDataSourceClass new];
self.table.dataSource = separateClass;
self.table.delegate = separateClass;
self.textField.delegate = separateClass;