Typecasting一个TableViewController类

时间:2010-08-11 20:17:16

标签: objective-c ios4

我遇到了类型转换或对象范围的问题。我得到了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 searchTableViewControllerpersonViewController。所以我希望能够使用相同的名称来实例化其中一个,这样我的其余代码就可以使用公共属性等对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];

2 个答案:

答案 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];