Embed Segue(嵌入式Segue)Demo

原创Blog,转载请注明出处

blog.csdn.net/hello_hwc

首先先看看Demo的效果

在一个ViewController中,嵌入一个TableViewController,然后这个TableViewController又在UINavigationController中。

Textfield和Add button在ViewController中,点击button,把textfield中的内容添加到嵌入式的tableViewController

Embed Segue(嵌入式Segue)Demo_第1张图片                                                          Embed Segue(嵌入式Segue)Demo_第2张图片

一 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

Embed Segue(嵌入式Segue)Demo_第3张图片

接着沿着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下载

http://download.csdn.net/detail/hello_hwc/8365813

你可能感兴趣的:(ios,嵌入式,segue,embedSegue)