Типизация класса TableViewController - PullRequest
0 голосов
/ 12 августа 2010

У меня проблема с приведением типов или областью видимости.Я получаю 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];

Ответы [ 2 ]

2 голосов
/ 12 августа 2010

Вы хотите объявить ваш 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];
}
0 голосов
/ 12 августа 2010

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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...