我有一个相对简单的应用程序。我有一个用户与之交互的全屏UIView子类(musicGridView),以及一个加载此类的UIScrollView子类(scrollView),以及一个ViewController和mainWindow.xib。
现在,我在nib中加载了一个viewController实例,它的类型为myViewController。 nib也有myUIView的实例,myViewController指向它。
在AppDelegate中,我这样做:
[window addSubview:scrollView];
[scrollView addSubview: viewController.view];
scrollView.musicGridView = (MusicGridView*) viewController.view;
我认为这是错误的。理想情况下,appDelegate没有scrollView实例。
在scrollView的AwakeFromNib类中,我在scrollView上进行初始化。
我认为应该采用的方法是在appDelegate中加载[window addSubview:viewController.view],然后将viewController指向scrollView的实例而不是musicGridView。然后,在scrollView awakeFromNib中添加musicGridView的子视图。
最终,我想创建另一个由scrollView拥有的视图,该视图实际上是一个侧面TabBar(使用给定的API是不可能的)用户可以向左滚动到达。
所以我猜其他MVC的东西,问题是,viewController应该指向scrollView,它包含所有其他内容的UIView子类,包括musicGridView?
答案 0 :(得分:0)
听起来您没有使用Interface Builder来设计UI。由于这是一个新项目,我建议这样做。您根本不必编写任何类似的代码。但是,您需要描述您的出路和行动。
在处理IB时,您需要了解的两个最重要的事项是IBOutlet
和IBAction
个关键字。
示例类标题:
@interface MyClass : NSObject {
IBOutlet UIScrollView* myScrollView;
}
- (IBAction) doWork;
@end
现在,您可以使用Interface Builder通过使用鼠标将源拖动到目标来连接这两件事。如果您需要更好地描述如何执行此操作,YouTube上有很多关于IB的教程视频。
答案 1 :(得分:0)
我是一个不使用Interface Builder进行UI设计的人;根据我的经验,你需要全部IB或全程序化。为了解决您的特定问题,我认为您需要将musicGridView作为UIScrollView的实例或扩展。
这可以在你的自定义viewController的loadView方法中完成 - 只需将它初始化为UIScrollView(并添加内容),而不是普通的旧UIView。
然而,如上所述,这种方法与以IB为中心的方法不兼容,正如UIViewController Class Reference
中所证实的那样。UIViewController的所有子类 应该实现loadView方法 设置视图属性除非你 从nib文件加载视图。