[英]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.