原创Blog,转载请注明出处
首先先看看Demo的效果
在一个ViewController中,嵌入一个TableViewController,然后这个TableViewController又在UINavigationController中。
Textfield和Add button在ViewController中,点击button,把textfield中的内容添加到嵌入式的tableViewController
一 Embed Segue简介
简而言之,就是一个ViewController的View嵌入到另外一个ViewController中,也称作childViewController。这样的设计是一块区域有一个单独的ViewController,从MVC的设计模式来看,这是一个解耦合的过程,由嵌入式的ViewController来负负责一块区域的Modol和View的协调,如果由一个ViewController来实现会造成单个ViewController过于臃肿。
二 Demo 的实现过程
原理很简单,在父ViewController中保存一个子ViewController的引用,这个指针为weak(防止参与到子ViewController的ARC计数),然后在PrepareForSegue中对这个引用初始化。在add button的target action中,调用子ViewController的接口.(这里暂不考虑用何种方式传值最优,不想把问题搞复杂了)
(1)创建一个基于单页面的工程
(2)在StoryBoard中拖入一个ContainView
然后,删掉默认的ViewController,拖入一个UITableViewController
接着沿着ContainView进行control+drag拖到tableviewController中,选择Embed。
然后,为Segue设置identifier。
其他部分比较简单,就是简单的拖拽,不做讲解。
(3)核心部分代码
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([[segue identifier] isEqualToString:@"EmbedSegue"]) {
if ([segue.destinationViewController isKindOfClass:[EmbedTableViewController class]]) {
self.embedVC = (EmbedTableViewController *)segue.destinationViewController;
}
if ([segue.destinationViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController * nav = (UINavigationController *)segue.destinationViewController;
self.embedVC = (EmbedTableViewController*)[nav.viewControllers firstObject];
}
}
}
- (IBAction)add:(id)sender {
if (self.textfield.text.length > 0) {
[self.embedVC addString:self.textfield.text];
self.textfield.text = nil;
}
}
在PreparedForSegue中,保存一个embed Segue的饮用。
注意,这里要判断有没有UINavigationController
然后,button的action中,调用embed Segue的接口来添加新的String
(4)tableView部分。
用NSMutableArray存储Model
然后在
addString接口中在最后一行插入
static NSString * identifer = @"cell";
@interface EmbedTableViewController()<UITableViewDataSource,UITableViewDelegate>
@property (strong,nonatomic) NSMutableArray * array;
@end
@implementation EmbedTableViewController
#pragma mark - Property
-(NSMutableArray *)array{
if (_array == nil) {
_array = [[NSMutableArray alloc] initWithObjects:@"initalFirst",@"initalSecond", nil];
}
return _array;
}
#pragma mark - API
-(void)addString:(NSString *)text{
[self.array addObject:text];
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:self.array.count-1 inSection:0]]
withRowAnimation:UITableViewRowAnimationLeft];
[self.tableView endUpdates];
}
#pragma mark - tableViewDataSource
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.array.count;
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifer forIndexPath:indexPath];
NSString * text = [self.array objectAtIndex:indexPath.row];
cell.textLabel.text = text;
return cell;
}
-(void)viewDidLoad{
[super viewDidLoad];
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
}
完整的Demo下载
CSDN下载