我有一个设计,我需要使用一个viewcontroller交换进出两个tableviews(我需要为两者显示相同的导航标题)。所以我在自己的子类tableviewcontroller类中创建了每个tableview,然后我在viewcontroller中为每个包含了一个类变量。每个tableview都将viewcontroller作为父视图,并在需要进行交换时调用viewcontrollers交换方法。下面列出了此方法和viewDidLoad方法:
- (void) viewDidLoad
{
[super viewDidLoad];
[[self navigationItem] setTitle: AddAPhotoViewControllerTitle];
SelectAnAlbumTableViewController *selectAnAlbumTableViewControllerTemp = [[SelectAnAlbumTableViewController alloc] initWithParent: self];
[self setSelectAnAlbumTableViewController: selectAnAlbumTableViewControllerTemp];
[selectAnAlbumTableViewControllerTemp release];
[[self view] insertSubview: [[self selectAnAlbumTableViewController] tableView] atIndex: 0];
}
- (void) switchTableViews
{
if ([[[self selectAnAlbumTableViewController] tableView] superview] == nil)
{
[[self view] insertSubview: [[self selectAnAlbumTableViewController] tableView] atIndex: 0];
[[[self selectAPhotoTableViewController] tableView] removeFromSuperview];
[selectAPhotoTableViewController release];
selectAPhotoTableViewController = nil;
}
else
{
SelectAPhotoTableViewController *selectAPhotoTableViewControllerTemp = [[SelectAPhotoTableViewController alloc] initWithAssetGroup: [[self selectAnAlbumTableViewController] assetGroup] parent: self];
[self setSelectAPhotoTableViewController: selectAPhotoTableViewControllerTemp];
[selectAPhotoTableViewControllerTemp release];
[[self view] insertSubview: [[self selectAPhotoTableViewController] tableView] atIndex: 0];
[[[self selectAnAlbumTableViewController] tableView] removeFromSuperview];
}
我有两个问题:
1)当我正在进行交换时,我正在插入新的tableview,为转换设置动画(我没有包含动画代码以保持简洁),然后从superview中删除旧的tableview。这是正确的顺序/正确的方法吗?它工作正常,但我想知道这里是否有一些代码味道。
2)使用这种设计模式,在每个tableview加载时可以显示的活动指示器的最佳方法是什么?我已经尝试在viewcontroller中实现指示器,它似乎工作正常,但我不知道如何设置它的位置?在什么方面?中心?我想这可以追溯到我问过的第一个问题,什么是超级视图,什么时候,或者甚至是否有超级视图?
答案 0 :(得分:2)
只需使用两个UITableViews。
实例化它们并将它们放在实例变量中。如果需要,保存状态,即显示哪个表视图。
答案 1 :(得分:1)
我认为没有错。我假设你的理由是每个表控制器都有自己的逻辑,值得一个单独的类。将控制器嵌入控制器中有点不正统,您必须通过视图生命周期调用。
示例:
-(void) switch
{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.75];
[UIView setAnimationDelegate:self];
if ([self.visibleVC isKindOfClass:[OrangeVC class]])
{
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];
[self.visibleVC viewWillDisappear:TRUE];
[self.visibleVC.view removeFromSuperview];
self.visibleVC = self.appleVC;
[self.view addSubview:self.visibleVC.view];
}
else if ([self.visibleVC isKindOfClass:[AppleVC class]])
{
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
[self.visibleVC viewWillDisappear:TRUE];
[self.visibleVC.view removeFromSuperview];
self.visibleVC = self.orangeVC;
[self.view addSubview:self.visibleVC.view];
}
[self.visibleVC viewWillAppear:TRUE];
[UIView commitAnimations];
}
注意viewWillAppear调用,至少需要唤醒表。我不确定你是否应该调用viewWillDisappear,但它不会受到伤害。如果不这样做,请在仪器中观察,以防控制器未正确清洁。
您可以在父控制器的self.view中添加任何活动hud,使用hud小部件,使当前加载的视图变暗,......,这是一个设计问题而不是技术问题。记住在父视图和启动切换的按钮上加载(userInteractionEnabled = NO)时禁用用户交互。