所有
在Apple的示例代码“DateCell”
中http://developer.apple.com/library/ios/#samplecode/DateCell/Introduction/Intro.html
ivar“pickerView”在MyTableViewController.h中声明如下:
@interface MyTableViewController : UITableViewController
{
@private
UIDatePicker *pickerView;
UIBarButtonItem *doneButton; // this button appears only when the date picker is open
NSArray *dataArray;
NSDateFormatter *dateFormatter;
}
@property (nonatomic, retain) IBOutlet UIDatePicker *pickerView;
...
它在类文件MyTableViewController.m中合成,如下所示:
@implementation MyTableViewController
@synthesize pickerView, doneButton, dataArray, dateFormatter;
...
当这个应用程序运行时,我可以将NSLog(@"%@",pickerView)
插入到ViewDidLoad中,并且确实看到,ivar pickerView是真实的并且具有值。但是,没有任何地方可以使用这个类alloc / init pickerView。这就是问题的根源:如果不明确地完成它会如何完成?
好吧,我天真地将这些东西复制到我的RootViewController.h和.m文件中,并确认我可以这样做,但是pickerView固执地保持未初始化(并且我的NSLog调用返回“(nil)”作为其值)no重要的是我没有明确地分配/启动它。当然RootViewController正在实例化,或者RootView不会出现,对吧?因此,我的pickerView不应该像苹果那样出现吗?
那么......我是否必须手动分配/初始化pickerView实例变量?如果是这样,Apple在做什么呢?或者他们是怎么做的呢?
我想我在这里遗漏了一些非常基本的东西,但我不知道它是什么。我在Interface Builder或XCode中看不到我和他们之间看起来不同的任何东西,但我现在已经有了隧道视觉,再也看不清楚了。
谢谢,
比尔
答案 0 :(得分:3)
此行上的IBOutlet修饰符是关键...
@property (nonatomic, retain) IBOutlet UIDatePicker *pickerView;
IBOutlet是一个装饰器,指示在加载相应的xib(Interface Builder)文件时将挂接/连接/初始化对象。您正在查找的示例应用程序将包含一个UITableViewController,它是一个与UIPickerView连接的xib。
您可以选择创建自己的自定义xib文件并连接到UIPickerView实例,也可以自己手动初始化选择器。
答案 1 :(得分:0)
Interface Builder(nib或xib)自动处理IBOutlet ivar与组件的连接。
IBOutlet是一个特殊的关键字 仅用于告诉Interface Builder 处理实例变量或属性 作为出路。它实际上被定义为 什么都没有,所以它对编译没有影响 时间。