我遇到了类型转换或对象范围的问题。我得到了uncaught exception
:
// Create the object here so that it's scope is outside the `if` statement, right?
searchTableViewController *newViewController;
if (rowSelected) {
// Typecast the object to a searchTableViewController
(searchTableViewController *)newViewController ;
// Initialize and Allocate
newViewController = [[searchTableViewController alloc] initWithSearchBar:NO grouped:NO];
}else{
// Typecast the global object to a personViewController
(personViewController *)newViewController;
// Initialize and Allocate
newViewController = [[personViewController alloc] init];
}
// Act on the object: create a data model object and store it as a property, etc.
newViewController.myDataModel = [[dataModel alloc] initWithSelected:selectedField delegate:newViewController];
我有2个类似的ViewControllers searchTableViewController
和personViewController
。所以我希望能够使用相同的名称来实例化其中一个,这样我的其余代码就可以使用公共属性等对viewController进行操作。
这导致Terminating due to uncaught exception
,无论如何看起来都是错误的方式。我需要在类型转换部门提供帮助,或者我需要帮助了解如何正确声明这些对象的范围,以便我可以在if
语句之内和之外使用它们。
最简单的方法是让我编写如下代码。如何在if
语句中声明,分配和实例化对象,然后在外部访问它?:
if (rowSelected) {
searchTableViewController *newViewController = [[searchTableViewController alloc] initWithSearchBar:NO grouped:NO];
}else{
personViewController *newViewController = [[personViewController alloc] init];
}
// This will probably give an error since newViewController is not in the proper scope.
newViewController.myDataModel = [[dataModel alloc] initWithSelected:selectedField delegate:newViewController];
答案 0 :(得分:2)
您希望将newViewController声明为您可能分配的两个对象的公共子类。可能是UIViewController。
UIViewController *newViewController;
if (rowSelected) {
// Initialize and Allocate
newViewController = [[SearchTableViewController alloc] initWithSearchBar:NO grouped:NO];
}else{
// Initialize and Allocate
newViewController = [[PersonViewController alloc] init];
}
当你就地使用它时,施法操作没有做任何事情。
编辑 - 如果这两个类都具有公共属性,例如dataModel,那么您可以通过创建从UIViewController派生并包含这些属性的公共基类来避免警告。然后,您将在上面第一行中更改视图控制器变量的声明,以匹配中间基类。
稍后编辑 - 如果您不想创建中间基类,可以执行以下操作(newViewController仍然必须声明为UIViewController):
if([newViewController respondsToSelector:@selector(setMyDataModel:)]) {
DataModel *dataModel = [[dataModel alloc] initWithSelected:selectedField delegate:newViewController];
[newViewController performSelector:@selector(setMyDataModel:) withObject:dataModel];
}
答案 1 :(得分:0)
RE:你的编辑
id newViewController;
if (rowSelected) {
newViewController = [[searchTableViewController alloc] initWithSearchBar:NO grouped:NO];
}else{
newViewController = [[personViewController alloc] init];
}
// This will probably give an error since newViewController is not in the proper scope.
newViewController.myDataModel = [[dataModel alloc] initWithSelected:selectedField delegate:newViewController];