【问题标题】:iOS viewDidLoad for UIViewUIView 的 iOS viewDidLoad
【发布时间】:2012-04-27 09:41:48
【问题描述】:

在 ViewController 中,有ViewDidLoad 知道 VC 何时加载。

对于一个 UIView,当视图加载时我必须使用什么方法?

这个方法会被任何 init 调用吗?

编辑: 没有 XIB,只是以编程方式。

【问题讨论】:

  • 取决于你从哪里加载它...
  • 嗨,谢谢,我正在从 viewController 加载视图

标签: ios uiview uiviewcontroller


【解决方案1】:

如果您从XIB 文件加载它,则在加载完成后将调用awakeFromNib 方法:

override public func awakeFromNib() {
    super.awakeFromNib();

    // ... loading logic here ...
}

更新;在没有 XIB 的情况下,您可能必须使用 the docs观察与视图相关的更改区域中的一种方法来推断它(例如,didMoveToSuperview)。但是,如果可能,更好的方法是从视图控制器的 viewDidLoad 方法向您的视图发送消息。

【讨论】:

  • 嗨,谢谢,我会编辑我的问题,没有 XIB,只是以编程方式
  • 如果重新加载 UIView 会再次触发吗?
【解决方案2】:

你可以使用 willMove(toSuperview newSuperview: UIView?)

import UIKit

final class myView: UIView {

  override func willMove(toSuperview newSuperview: UIView?) {
     super.willMove(toSuperview: newSuperview)
     //Do stuff here
   }

} 

Apple Docs

【讨论】:

    【解决方案3】:

    实际上,对于视图的初始化,您不必对视图控制器的方法 viewDidLoad() 做任何事情。所有你想做的,你都可以在视图的 init 方法中做。 例如,在视图控制器的 viewDidLoad() 中,有一些初始化代码:

    - (void)viewDidLoad{
        [super viewDidLoad];
    
        // init your parameters here
    }
    

    类似地,在您的视图的 init 方法中:

    - (id)initWithDelegate:(id)_delegate
    {
        self = [[[[NSBundle mainBundle] loadNibNamed:@"YourView" owner:self options:nil] objectAtIndex:0] retain];
        if (self) {
            [super init];
    
            self.delegate = _delegate;
    
            // init your parameters here
    
            return self;
    
        }
        return nil;
    }
    

    然后,您从视图控制器创建 YourView,如下所示:

    YourView view = [[YourView alloc] initWithDelegate:self];
    [self.view addSubview:view];
    [view release];
    

    此外,当你的视图加载时你想要做的事情,你可以放在你视图的 layoutSubviews 方法中,像这样:

    -(void)layoutSubviews{
        [super layoutSubviews];
    
        // init your parameters here, like set up fonts, colors, etc...
    }
    

    我想,这正是你所需要的。

    干杯!

    【讨论】:

      【解决方案4】:

      斯威夫特 2:

      import UIKit
      
      class myView: UIView {
      
        override func layoutSubviews() {
          print("run when UIView appears on screen")
          // you can update your label's text or etc.
        }
      }
      

      【讨论】:

      • 这与 Swift 2 无关。它是基于约束的布局的覆盖点。引用框架中的注释:“覆盖点。由 layoutIfNeeded 自动调用。从 iOS 6.0 开始,当使用基于约束的布局时,基本实现应用基于约束的布局,否则它什么也不做。”
      • 警告:layoutSubviews 可以触发多次,当然不是执行任何设置代码(例如 viewDidLoad)的地方
      【解决方案5】:

      我遇到了类似的问题,并找到了相对简单的解决方案。想法是在正确的时间将 viewDidLoad 发送到每个子视图,并在您感兴趣的类上重载该方法。

      为此,请在您的类中添加这部分代码...

      //  UIViewController
      - (void)viewDidLoad
      {
      
          [super viewDidLoad];
      
          [self.view viewDidLoad];
      }
      
      
      //  UIView+Loading.m
      #import < UIKit/UIKit.h>
      
      @implementation UIView (Loading)
      
      - (void)viewDidLoad
      {
      
          for (UIView* subview in self.subviews)
      
              [subview viewDidLoad];
      }
      
      @end
      
      
      //  UIView+Loading.h
      #import < UIKit/UIKit.h>
      
      @interface UIView (Loading)
      
      - (void)viewDidLoad;
      
      @end
      
      
      // UIView_CustomImplementation
      
      - (void)viewDidLoad
      {
      
          NSLog(@"Do whatever you want to do in custom UIView after method viewDidLoad on UIViewController was called");
      
      }
      

      【讨论】:

        【解决方案6】:

        据我所知,我认为除了init之外没有这样的方法。通常我在init方法中做准备。您可以创建自己的viewDidLoad 方法并手动调用它。但大多数时候,UIView 是由它的视图控制器管理的,因此视图控制器应该知道何时加载视图,如果要配置视图,可以在视图控制器中进行。顺便说一句,viewDidLoad 方法并不总是被调用。

        【讨论】:

        • 我从未见过viewDidLoad not 被调用。什么情况下不调用?
        • @devios1,我假设如果您在 viewDidLoad 之后以编程方式插入子视图。
        【解决方案7】:

        这不太行。

        - (void)viewDidLoad 在视图控制器加载时不会被调用;它在视图控制器的视图加载时调用。

        所以你可以创建 UIViewController,唯一会被调用的方法是用于初始化它的 init 方法。不会创建视图,不会调用 -(void)viewDidLoad 方法等。

        然后当其他东西向视图控制器询问它的视图时,通过:

        viewController.view;
        

        然后视图控制器调用:

        - (void)loadView; // This is where you put your own loading view information, and set the viewController's self.view property here.
        

        接着是:

        - (void)viewDidLoad;
        

        View Did Load 是一个单独的方法,因此您不必中断实际的 loadView 方法和复杂的视图加载选项。当开发人员不确定 Apple 在做什么以及他们的最佳实践是什么时,在使用 nib 等时子类化和覆盖 loadView 方法可能会导致问题,因此 Apple 将方法分离出来是明智的。

        然后,当出现内存警告时,视图被释放,并设置为 nil:

        - (void)viewWillUnload;
        // view unloaded and set to nil.
        - (void)viewDidUnload;
        

        【讨论】:

        • 这个答案并不能完全反映问题的重点......提问者不需要视图控制器。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-28
        • 1970-01-01
        • 1970-01-01
        • 2012-02-06
        相关资源
        最近更新 更多