从视图控制器访问界面构建器对象

时间:2014-09-12 19:50:53

标签: ios objective-c xcode

我是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

但是调用它时我的滑块和标签都是nil。我理解viewDidLoad类中有一个ViewController方法,这可能是我需要的,但我不知道如何访问我的Controller类的实例(似乎是实例化的)在该方法中,由界面构建器在后面的某个地方。是否所有这些代码都应该简单地移动到ViewController本身?这似乎是有道理的,但上面的设计是我们在课堂上指示的,所以我不确定如何去做。

1 个答案:

答案 0 :(得分:2)

在XIB / Storyboard加载器完成加载所有对象并将它们连接起来之后,它会将awakeFromNib发送到从XIB实例化的每个对象。因此,请尝试将其添加到Controller课程中:

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

您可以在NSObject UIKit Additions Reference“The Nib Object Life Cycle” in the Resource Programming Guide中找到更多信息。

,如果您将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];
}