我无法将类的实例分配给以下UITableViewController
子类:
@interface MyTableViewController : UITableViewController </*usual protocols*/>
@property (nonatomic, retain) MyClass *myClass;
@end
我正在将MyClass的非null实例分配给MyTableViewController的实例,如下所示:
MyTableViewController *myTableViewController = [[MyTableViewController alloc] init];
MyClass *nonNullInstanceOfMyClass = [[MyClass alloc] init];
myTableViewController.myClass = nonNullInstanceOfMyClass;
[self.navigationController pushViewController:myTableViewController animated:YES];
[nonNullInstanceOfMyClass release];
[myTableViewController release];
问题是myClass是MyTableViewController的null
中的viewDidLoad
。 为什么会这样?
编辑#1 :我通过NSLogging检查nonNullInstanceOfMyClass是否为空。
编辑#2 :提供更多代码。在我推动视图控制器之前似乎也调用viewDidLoad
(这可能会导致问题......虽然看起来很奇怪)。
编辑#3 :通过将self.tableView.delegate = nil;
和self.tableView.dataSource = nil;
从init
移至viewDidLoad
来修复。
答案 0 :(得分:0)
您是否在实例化视图控制器和分配属性之间做了什么?将视图控制器推入导航堆栈时,不一定会调用viewDidLoad
- 只要需要加载视图,就会调用它。因此,例如,NSLog(@"%@", myTableViewController.view);
会触发viewDidLoad
,如果您在分配属性之前执行此操作,则可以解释此行为。
您可以发布实际代码而不是近似值吗?你可能会遗漏重要的细节。
答案 1 :(得分:0)
从xib加载View时会触发viewDidLoad。
你有几个选择。
最简单的是viewDidAppear:方法
- (void)viewDidAppear:(BOOL)animated
{
// Handle what you want for when your view has become visible.
// This may happen more then once. So a flag for the first time will
// give you a sufficient Limit for Initialization
}
或者是viewWillAppear:
另一种选择是让IB以这种方式加载Class,而不是null。并将在viewDidLoad中提供:
你的MyClass需要是一个UIView。
将UIView(作为占位符)放入TableViewController的View所在的位置。
然后在Custom Class中的Identity Inspector中的Interface Builder中设置其类类型。
最后,您从IBOutlet
拖动连接@property (nonatomic, retain) IBOutlet MyClass *myClass;
到界面构建器
中的自定义类UIView然后,当“接口”构建器初始化您的类时,它将使用该类的空白实例填充该属性。
第三个选项是延迟加载属性
这是我如何延迟加载
//we will take for granted that your @property is in the header
//and the following Synthesize is on the class
@synthesize myClass=_myClass; // setting instance variable to avoid confusion
- (MyClass*) myClass
{
if (_myClass == nil) _myClass = [[MyClass alloc] init];//Create a default instance and retain it
return _myClass;
}
然后你使用self.myClass,你的getter方法将为你创建一个。
修改强>
我将= _myClass添加到@synthesize以将实例变量更改为远离属性
这样使用myClass会产生错误,你将被迫使用self.myClass来获取属性访问器。
答案 2 :(得分:-1)
更改以下行:
@property (nonatomic, retain) MyClass *myClass;
为:
@property (nonatomic, assign) MyClass *myClass;