多个UITableView数据传递 、父子控制器


多个UITableView数据传递

需求:左右两个UITableView,当点击左边UITableView时,右边的UITableView数据跟随变化
方法一:(两个UITableViewController)
1、使用两个UITableViewController,设置右边为左边的代理,右边监听左边的点击。
2、在左边的UITableViewController自定义一个代理方法,供右边的UITableViewController来实现,
3、通过点击左边的控制器的cell来传递数据。右边的控制器根据传递过来的数据reloadData刷新数据。
方法二:(两个UITableView)
1、使用两个UITableView,设置两个UITableView的数据源都是UIViewController。
2、设置行,组,每个cell的样式时,都判断当前是哪个UITableView。
3、当点击左边表格是,reloadData刷新右边表格的数据。


注意

1、UITableView的数据突然不见了,可能是由于数据源挂了,UITableViewController挂了。
2、防止重复创建使用懒加载。
3、同一个UITableView,多次addSubviews添加到一个控制器中,只会存在一个(只会将他添加到最上面来)
4、多个UITableView同时存在就会出现问题:当设置透明度时,会看到后面的UITableView。[tableview removeFromSuperView]将不需要显示的tableview移除(移除不一定会销毁,销毁需要没有强指针指向)
5、默认情况下,从XIB加载的控制器的view的autoresizingMask属性默认包含有UIViewAutoresizingFlexibleWidth和UIViewAutoresizingFlexibleHeight
解决:autoresizingMask设置为UIViewAutoresizingNone。


多个控制器切换

将这些控制器添加到一个数组中addChildViewController,根据这个控制器在数组中的位置,能直接切换到相应的控制器的view,其实这就是childViewControllers。


点击view,push到下个界面

需求:导航控制器的rooViewController是oneViewController,oneViewController中的oneView有个小的twoView,点击twoView,push到某个界面。
方法:让twoView控制器twoViewController成为oneViewController的子控制器,才能拿到导航控制器。


点击view,push到下个界面

需求:导航控制器的rooViewController是oneViewController,oneViewController中的oneView,点击oneView,modal出来twoView,
twoView上有个threeView,点击threeView就dismiss掉整个twoView。
方法:将threeViewController成为twoViewController的子控制器。


横竖屏
会调用方法(已过期):
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;
正是由于有了childViewControllers,屏幕横竖屏效果才能抵达子控制器。
原则:如果2个控制器的view是父子控制器(即使中间隔一个view),那么这2个控制器也应该是父子控制器。
[a.view addSubView:b.view];
[a addChildViewController:b];
即使中间隔一个view:
[a.view addSubView:otherView];
[otherView addSubView:b.view];
[a addChildViewController:b];
从childViewControllers中移除控制器removeFromParentViewController

总结
获得所有的子控制器
@property(nonatomic,readonly) NSArray *childViewControllers;

添加一个子控制器
//OneViewController成为了self的子控制器
//self成为了OneViewController的父控制器
[self addChildViewController:[[OneViewController alloc] init]];
// 通过addChildViewController添加的控制器都会存在于childViewControllers数组中

获得父控制器
@property(nonatomic,readonly) UIViewController *parentViewController;

将一个控制器从它的父控制器中移除
// 控制器a从它的父控制器中移除
[a removeFromParentViewController];

注意
  当前控制器已经被添加到某个父控制器上时就会调用这个方法
  当前控制器从父控制器中移除也会调用这个方法
     - (void)didMoveToParentViewController:(UIViewController *)parent
>
  如果是手动创建的`容器`用于保存子控制器,但是添加进去后没有`过渡动画`,就需要手动调用
     - (void)didMoveToParentViewController:(UIViewController *)parent,
  但是不管有没有`过渡动画`都会调用
     -(void)willMoveToParentViewController:(UIViewController *)parent)
  这两个方法一般不用。

你可能感兴趣的:(多个UITableView数据传递 、父子控制器)