我是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
本身?这似乎是有道理的,但上面的设计是我们在课堂上指示的,所以我不确定如何去做。
答案 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];
}