我已经设置了一个基本的测试应用程序,它显示一个包含标签的视图,而不使用IB。我想使用自定义UIView子类和自定义UIViewController子类。
这将按预期运行,但MyViewController的viewWillAppear和其他类似的委托不会触发。
我错过了什么来制造这些火?在以前的项目中(使用IB),这些都会很好地触发。
以下是完整的代码:
AppDelegate -加载“MainVC”视图控制器并将其设置为根控制器
#import "AppDelegate.h"
#import "MainVC.h"
@implementation AppDelegate
@synthesize window = _window;
@synthesize mainVC = _mainVC;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.mainVC = [[MainVC alloc] init];
self.window.rootViewController = self.mainVC;
[self.window makeKeyAndVisible];
return YES;
}MainVC -创建一个“MyViewController”来分配“MyView”(它还传递应该用于视图的帧大小)
#import "MainVC.h"
#import "MyViewController.h"
@implementation MainVC
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
MyViewController *controller = [[MyViewController alloc] init];
CGRect frame;
frame.origin.x = 5;
frame.origin.y = 5;
frame.size.width = self.view.frame.size.width - (2 * 5);
frame.size.height = self.view.frame.size.height - (2 * 5);
controller.startingFrame = frame;
[self.view addSubview:controller.view];
}
return self;
}MyViewController -创建MyView
#import "MyViewController.h"
#import "MyView.h"
@implementation MyViewController
@synthesize startingFrame;
- (void)loadView{
self.view = [[MyView alloc] initWithFrame:startingFrame];
}
- (void)viewWillAppear:(BOOL)animated{
NSLog(@"appearing"); //doesn't do anything
}
- (void)viewDidAppear:(BOOL)animated{
NSLog(@"appeared"); //doesn't do anything
}MyView
#import "MyView.h"
@implementation MyView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor whiteColor];
label = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 150, 40)];
[label setText:@"Label"];
[self addSubview:label];
}
return self;
}发布于 2012-05-29 15:26:01
您的错误:您正在设置一个根视图控制器,然后在此基础上添加另一个视图控制器视图。当第二个视图被添加到视图层次结构时,它的视图控制器以这种方式保持“未连接”。事实上,如果您检查MainViewController的parentViewController,您会注意到它是nil。
为什么: viewWillAppear方法将仅发送到根视图控制器或根视图控制器层次结构中的视图控制器(使用presentModalViewController:animated:或presentViewController:animated:completion:表示的控制器)。
解决方案:要解决这个问题,您有几个选项:
发布于 2012-05-29 15:52:18
有一些非常基本的事情出了问题:
initWithNibNamed:中为您的MainViewController完成了整个设置,但是您正在创建它,只调用init。所以你的设置永远不会发生loadView中安装VC控制器,就像在MyViewController中那样。在您的例子中,这是使事情工作的唯一方法,因为MyVC实际上从未完全启动和运行,但是这种方法是错误的--基本上是强迫设置视图,尽管控制器本身从来没有控制过任何东西还有一些事情,但它们是最重要的--似乎再读一遍模型-视图-控制器概念的整个基本概念是个好主意。接下来,您应该深入研究UIViewController和UIView的类引用。
即使您最终能够使用当前的方法获得您想要的结果,从长远来看,它也不会对您有所帮助,因为您将不会正确地使用涉及的元素。
发布于 2012-06-04 18:08:06
方法不会在另一个视图控制器内的视图控制器上调用。如果只为iOS 5开发,那么请查看可用于解决此问题的UIViewController developing 。如果希望应用程序与以前的iOS版本兼容,可以将方法调用转发到子视图控制器。就我个人而言,我更喜欢子类SFContainerViewController,它自动处理这个问题:https://github.com/krzysztofzablocki/SFContainerViewController
https://stackoverflow.com/questions/10801845
复制相似问题