首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >viewWillAppear未被触发

viewWillAppear未被触发
EN

Stack Overflow用户
提问于 2012-05-29 15:08:57
回答 3查看 1.2K关注 0票数 2

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

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

我错过了什么来制造这些火?在以前的项目中(使用IB),这些都会很好地触发。

以下是完整的代码:

AppDelegate -加载“MainVC”视图控制器并将其设置为根控制器

代码语言:javascript
复制
#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”(它还传递应该用于视图的帧大小)

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-29 15:26:01

您的错误:您正在设置一个根视图控制器,然后在此基础上添加另一个视图控制器视图。当第二个视图被添加到视图层次结构时,它的视图控制器以这种方式保持“未连接”。事实上,如果您检查MainViewController的parentViewController,您会注意到它是nil

为什么: viewWillAppear方法将仅发送到根视图控制器或根视图控制器层次结构中的视图控制器(使用presentModalViewController:animated:presentViewController:animated:completion:表示的控制器)。

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

  1. 使用视图控制器作为根视图控制器。
  2. 通过上述方法之一呈现视图控制器
  3. 保持代码原样,并手动将这些事件连接到子视图控制器(不过,请注意此方法,因为我相信您提到的事件是在iOS 5下自动转发的--您可以轻松地检查这一点)。
  4. 如果我还记得,另一种使这些事件被转发到视图控制器的方法是将视图控制器的视图添加到窗口,而不是添加到父视图。
票数 3
EN

Stack Overflow用户

发布于 2012-05-29 15:52:18

有一些非常基本的事情出了问题:

  • 您在initWithNibNamed:中为您的MainViewController完成了整个设置,但是您正在创建它,只调用init。所以你的设置永远不会发生
  • 您正在实现第二个VC (MyViewController),显然只是创建myView,然后将其添加到rootVCs层次结构中。不太好!只有一个VC (在您的例子中是MainViewController)应该负责创建和管理其层次结构中的视图。
  • 不要在loadView中安装VC控制器,就像在MyViewController中那样。在您的例子中,这是使事情工作的唯一方法,因为MyVC实际上从未完全启动和运行,但是这种方法是错误的--基本上是强迫设置视图,尽管控制器本身从来没有控制过任何东西

还有一些事情,但它们是最重要的--似乎再读一遍模型-视图-控制器概念的整个基本概念是个好主意。接下来,您应该深入研究UIViewControllerUIView的类引用。

即使您最终能够使用当前的方法获得您想要的结果,从长远来看,它也不会对您有所帮助,因为您将不会正确地使用涉及的元素。

票数 2
EN

Stack Overflow用户

发布于 2012-06-04 18:08:06

方法不会在另一个视图控制器内的视图控制器上调用。如果只为iOS 5开发,那么请查看可用于解决此问题的UIViewController developing 。如果希望应用程序与以前的iOS版本兼容,可以将方法调用转发到子视图控制器。就我个人而言,我更喜欢子类SFContainerViewController,它自动处理这个问题:https://github.com/krzysztofzablocki/SFContainerViewController

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10801845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档