Вопрос по ios, uiview – iOS viewDidLoad для UIView

52

В ViewController естьViewDidLoad знать, когда VC загрузился.

Для UIView, какой метод я должен использовать при загрузке представления?

Будет ли этот метод вызываться с любым init?

редактировать: Нет XIB, только программно.

привет спасибо, я загружаю представление из viewController MaKo
Зависит от того, откуда вы его загрузили ... borrrden

Ваш Ответ

7   ответов
6

Swift 2:


class myView: UIView {

  override func layoutSubviews() {
    print("run when UIView appears on screen")
    // you can update your label's text or etc.
  }
}
Предупреждение: layoutSubviews может запускаться несколько раз и, безусловно, не место для выполнения какого-либо установочного кода (например, viewDidLoad)
Это не имеет никакого отношения к Swift 2. Это точка переопределения для макета на основе ограничений. Цитирование комментария в фреймворке: точка переопределения. вызывается layoutIfNeeded автоматически. Начиная с iOS 6.0, когда используется компоновка на основе ограничений, базовая реализация применяет компоновку на основе ограничений, в противном случае она ничего не делает. & Quot;
-1

я не думаю, что существует такой способ, кроме init. Обычно я делаю подготовку в методе init. Вы можете создать свой собственныйviewDidLoad метод и вызвать его вручную. Но большую часть времени UIView управляется его контроллером представления, так что контроллер представления должен знать, когда представление загружено, если вы хотите сконфигурировать представление, вы можете сделать это в контроллере представления. Кстати,viewDidLoad метод не всегда вызывается.

@ devios1, я полагаю, если вы вставили подпредставление программно после viewDidLoad.
Я никогда не виделviewDidLoad not называется. При каких обстоятельствах это не будет называться?
2

import UIKit

final class myView: UIView {

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

} 

Apple Docs

2

и я нашел относительно простое решение. Идея состоит в том, чтобы отправить 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");

}
37

метод awakeFromNib будет вызываться при загрузке из XIB.

edit В случае отсутствия XIB вам, вероятно, придется вывести его, используя один из методов изObserving View-Related Changes зонадокументы (например, didMoveToSuperview). Тем не менее, лучшим способом является отправка сообщения вашим представлениям из контроллера представления в методе viewDidLoad.

привет спасибо отредактирую мой вопрос, нет XIB, просто программно MaKo
отличный ответ, абсолютно правильный!
Срабатывает ли снова, если перезагружен UIView?
7

роллера представления для инициализации вашего представления. Все, что вы хотите сделать, вы можете сделать с помощью метода 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...
}

Я думаю, это то, что вам нужно.

Ура!

-6

- (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 и параметры загрузки сложного представления. Создание подклассов и переопределение метода loadView при использовании перьев и т. Д. Может привести к проблемам, когда разработчики не уверены в том, что делает Apple, и каковы их лучшие практики, поэтому для Apple было разумным разделить метод.

Затем, когда появляется предупреждение о памяти, представление освобождается и устанавливается равным nil:

- (void)viewWillUnload;
// view unloaded and set to nil.
- (void)viewDidUnload;
это то, как это работает в контроллере uiview НЕ UIView ...
Этот ответ не полностью отражает вопрос ... спрашивающему не нужен контроллер представления.
правильный ответ здесьstackoverflow.com/a/4502761/2757496

Похожие вопросы