gpt4 book ai didi

ios - viewWillAppear 未被触发

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:32:25 28 4
gpt4 key购买 nike

我已经设置了一个基本的测试应用程序,它显示一个包含标签的 View ,没有使用 IB。我想使用自定义 UIView 子类和自定义 UIViewController 子类。

这将按预期运行,但 MyViewController 的 viewWillAppear 和其他类似委托(delegate)不会触发。

我缺少什么来生火?在以前的项目(使用 IB)中,这些会很好。

完整代码如下:

AppDelegate - 加载“MainVC” View Controller 并将其设置为根 Controller

#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 - 创建一个分配“MyView”的“MyViewController”(它还传递应该用于 View 的帧大小)

#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
}

我的 View

#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;
}

最佳答案

您的错误:您正在设置一个 Root View Controller ,然后在其之上添加另一个 View Controller View 。当第二个 View 被添加到 View 层次结构时,它的 View Controller 以这种方式保持“未连接”。事实上,如果您检查 MainViewController 的 parentViewController,您会注意到它是 nil

原因: viewWillAppear 方法将仅发送到 Root View Controller 或 Root View Controller 层次结构中的 View Controller (那些使用 presentModalViewController:animated:presentViewController:animated:completion:).

解决方案:要解决这个问题,您有几种选择:

  1. 使用你的 View Controller 作为 Root View Controller
  2. 通过上述方法之一展示您的 View Controller
  3. 保持您的代码不变,并手动将这些事件连接到 subview Controller (不过请注意此方法,因为我相信您提到的事件会在 iOS 5 下自动转发 - 您可以轻松检查)。
  4. 如果我没记错的话,另一种将这些事件转发到您的 View Controller 的方法是将您的 View Controller 的 View 添加到窗口,而不是父 View 。

关于ios - viewWillAppear 未被触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10801845/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com