0

我一直在尝试解释 CS193P 的课程,并有几个问题。

我在代码中构建视图,我这样做的方式是我有一个 UIView 子类,我将所有视图放在 init 方法中。这个类由 ViewController 初始化。

那么问题是,从这里开始的正确方法是什么 - 比如说我想为我放置在 0,0 到 100,100 的按钮设置动画。我想从 ViewController 对其进行动画处理,但我不喜欢我在 UIView 类中设置 0,0 位置(在初始化程序中),现在我在 ViewController 中设置一个新位置。我希望只有一个地方知道我的观点的实际 (x,y) 位置。

我该怎么办?

  1. 将初始化程序中的位置移动到 ViewController
  2. 在我的 UIView “-(void)AnimateToSecondPosition” 中放置一个方法,其中实际的“第二位置”取决于视图?
  3. 放手吧。如果我将按钮放在界面构建器中,这似乎是正确的方法 - 我认为界面构建器是视图......

或者甚至是第四个选项?

请帮助我更好地理解它,而不仅仅是给我正确的答案;)

我希望能够以某种方式将我的方法与使用界面构建器的方式进行比较,因此我的每个视图都是公开的并且可以从控制器访问 - 这样我相信我可以轻松地开始使用界面构建器,而不是我想在不更改控制器代码的情况下连接插座。

我猜想禁用,隐藏和使用视图做其他事情的情况是一样的。

提前致谢。

4

2 回答 2

0

您可以-setButtonFrameToSecondPosition向视图子类添加一个,它只是更新按钮的框架,然后通过其中一种+[UIView animate:...]方法从视图控制器调用它。

于 2014-01-25T11:42:04.113 回答
0

如果你想以编程方式创建一个新的视图,你通常应该在你的视图控制器中使用它指定的初始化器来实例化它:

 UIView *testView = [[UIView alloc]initWithFrame:myFrame];

如果你创建一个自定义视图,在 init 方法中放置一些配置代码是完全正确的,但是你的 ViewController 应该负责决定如何处理这个视图——这是他的工作!使用 MVC,视图和模型不应该直接通信(正如您在 CS193P 的第一课中肯定学到的)。

因此,这同样适用于动画。您应该在 ViewController 中为 View 设置动画,而不是在 View 本身中实现动画。

因此,在我看来,你的“第二位置”应该由 VC 设置 - 如果在视图发生某些事情时必须这样做(例如,有人按下 UIButton),你应该为你的 VC 设置一个目标/动作并在你的风险投资。

添加: 关于在 Interface Builder 中构建 UIViews,我不知道您所说的“让他们离开”是什么意思。Interface builder 将创建视图并在运行时将它们添加到特定的超级视图中 - 正如您在下面的示例中所见,您可以在左侧以图形方式控制视图层次结构。例如,在这种情况下,有一个 UIView(为了清楚起见,我将其涂成绿色)和两个按钮。一个是主视图的子视图,另一个是绿色 UIView 的子视图。 故事板示例

加载 ViewController 后,视图层次结构会自动加载到 self.view - 事实上,如果您在加载时在 VC 中运行以下代码,您将在控制台中看到 self.views 子视图的列表。

for (UIView *view in self.view.subviews){
    NSLog("%@", [view description]);
}

如果您已经知道需要更改您通过 Interface Builder 设置的特定 UIView 的某些属性(例如,我们知道我们想以编程方式更改上面示例中绿色 UIView 的颜色),您应该创建一个插座,让您拥有在您的代码中对该视图的引用。您可以通过 crtl-drag 从情节提要到您的 ViewController 代码来执行此操作 - 请参见下面的示例。

创建插座 1 创建插座 2 创建插座 3

完成后,您可以在代码中将其作为任何其他属性引用,不同之处在于它是由 Interface Builder 创建的。

希望这可以帮助。

于 2014-01-25T11:42:34.370 回答