【问题标题】:Reloading a Subview Objective C重新加载子视图目标 C
【发布时间】:2013-07-11 14:43:28
【问题描述】:

我有这段代码,它根据在表视图中选择的选项将子视图设置为某个 ViewController 的视图。代码如下:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self setMainView:[[[self controllerArray] objectAtIndex:[indexPath row]] view]];
    [self setCurrentViewController:[indexPath row]];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

最初添加子视图的代码如下所示:

[self setMainView:[[[self controllerArray] objectAtIndex:0] view]];
[[self view] addSubview:[self mainView]]

问题在于更改子视图的代码不会更新子视图,因此视图永远不会真正加载。我可以通过将视图从子视图 ([[self mainView] removeFromSuperview]) 中删除来重新加载视图,但这会导致它重新加载到中心。子视图可以根据用户手势移动,我想把它放在同一个地方。有没有办法重新加载子视图,或者我必须跟踪子视图的位置,然后在删除它并再次添加后设置它。

编辑: 一个有趣的注释: 此代码完美运行(视图停留在先前的坐标):

[[self mainView] removeFromSuperview];
[self setMainView:[[[self controllerArray] objectAtIndex:[indexPath row]] view]];
[[self view] addSubview:[self mainView]];
[self setCurrentViewController:[indexPath row]];
[tableView deselectRowAtIndexPath:indexPath animated:YES];

第一次切换视图除外。我可以设置一次坐标,但有没有更快的方法,所以我不必每次切换时都删除和添加视图。

【问题讨论】:

  • “重新加载”是什么意思?
  • 您应该在视图控制器的视图上实现layoutSubviews 方法并调用[self.view layoutIfNeeded] 来重新调整所有子视图的位置。
  • @JustinMeiners 该视图不会自动更新到新视图(在我将其设置为新视图后它仍然显示旧视图)。有没有办法更新它。
  • @Eimantas 设置位置不是问题。问题是重新加载内容。
  • @cabellicar123 所以你删除一个视图?添加新视图?它仍然显示旧视图?

标签: ios objective-c cocoa-touch uiview


【解决方案1】:

这能解决问题吗?

[[self mainView] removeFromSuperview];
[self setMainView:[[[self controllerArray] objectAtIndex:[indexPath row]] view]];
[self addSubview:[self mainView]];
[self setCurrentViewController:[indexPath row]];
[tableView deselectRowAtIndexPath:indexPath animated:YES];

编辑1: 如果只是要重置的位置,可以添加属性 CGRect originalFrame 并在添加子视图的代码中添加:

[self setMainView:[[[self controllerArray] objectAtIndex:0] view]];
[[self view] addSubview:[self mainView]];
self.originalFrame = [self mainView].frame;

然后当你想重置位置时使用:

[[self mainView] setFrame:self.originalFrame];

编辑2: 也许使用视图的“隐藏”属性就足够了?这样,您可以一次将它们全部保留为子视图,但只使一个可见,就像这样

[self mainView].hidden = YES;
[self setMainView:[[[self controllerArray] objectAtIndex:[indexPath row]] view]];
[self mainView].hidden = NO;
[self setCurrentViewController:[indexPath row]];
[tableView deselectRowAtIndexPath:indexPath animated:YES];

记得在开始时添加所有子视图,并将它们的 hidden 设置为 YES,除了您希望首先可见的视图。

【讨论】:

  • 感谢您的尝试,但正如问题中所述,我知道我可以做到这一点,但我想要一种更快且代码更少的方法(我必须重置视图的坐标)
  • 编辑了答案。这是你需要的吗?
  • 再次感谢您的尝试,但我知道如何设置位置。我想知道耗时较少的解决方案(删除和添加子视图需要一些时间)
  • 那我好像不太明白你想做什么。你能一步一步解释你的目标是什么吗?
  • 我有能力完成这项工作:请参阅编辑。我现在想知道是否有更好的方法来更新子视图,这样我就不必删除它然后再次添加它。
猜你喜欢
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 2021-10-23
  • 2012-08-01
  • 1970-01-01
相关资源
最近更新 更多