繁体   English   中英

从视图控制器访问接口构建器对象

[英]Accessing interface builder object from view controller

我对Objective-C,XCode和iOS开发是完全陌生的,并且我试图找出在实例化所有UI视图和控件之后如何在启动时运行某些代码的方法。 我有一个通用的NSObject,可以通过将其拖动到视图控制器场景中来通过界面生成器添加。 它的定义如下:

#import <Foundation/Foundation.h>

@interface Controller : NSObject {
    IBOutlet UISlider *slider;        
    IBOutlet UILabel *label;
}

-(IBAction)sliderChanged:(id)sender;

@end

我需要在初始化时运行sliderChanged。 我尝试了以下方法:

#import "Controller.h"

@implementation Controller

-(id)init {
    self = [super init];
    if (self){
        [self sliderChanged:nil];
    }
    return self;
}
// More code here

但是,当我调用它时,我的滑块和标签都为零。 我知道ViewController类中有一个viewDidLoad方法,可能是我所需要的,但是我不确定如何从中访问我的Controller类的实例(它似乎是由界面生成器实例化的)。方法。 是否应该将所有这些代码简单地移到ViewController本身? 这似乎是有道理的,但是上面的设计是我们在课堂上得到的指导,因此我不确定如何执行此操作。

XIB / Storyboard加载器完成所有对象的加载并进行接线后,它将awakeFromNib发送到从XIB实例化的每个对象。 因此,请尝试将其添加到Controller类中:

- (void)awakeFromNib {
    [super awakeFromNib];
    [self sliderChanged:nil];
}

您可以在《 NSObject UIKit添加参考》资源编程指南 》中的“笔尖对象生命周期”中找到更多信息。

但是 ,如果你创建Controller作为一个顶级对象,而你没有任何插座连接它,那么XIB装载机为完成后,这样系统就会重新释放它没有引用它。 那可能不是您想要的,因此您应该将视图控制器中的插座连接到Controller 如果这样做(并且将出口命名为controller ),则可以在视图控制器类的viewDidLoad中访问它:

#import <UIKit/UIKit.h>
#import "Controller.h"

@interface ViewController : UIViewController {
    IBOutlet Controller *controller;
}
@end

实现方式:

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.controller sliderChanged:self];
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM