Как бороться с ошибками Objective-C в динамических блоках кода? - PullRequest
1 голос
/ 04 апреля 2011

Я уверен, что ответ на этот вопрос смущающий базовый, но у меня возникают проблемы с пониманием того, как компиляция / проверка ошибок в реальном времени в XCode должна работать с динамической природой Objective-C.

Например, я хочу установить setEditing: YES для tableView того, что topViewController находится в моем стеке контроллеров представления. Поэтому я пытаюсь это:

[self.navigationController.topViewController.tableView setEditing: YES animated: YES];

И XCode жалуется: Property 'tableView' not found on object of type 'UIViewController'.

Теперь этот код находится в UIViewController, но он будет вызываться только тогда, когда topViewController является UITableViewController, но, очевидно, Xcode этого не знает.

Как мне это исправить? Это свидетельствует о плохой практике кодирования с моей стороны? Я попытался обернуть строку в условное выражение, чтобы проверить это topViewController.tableView! = Nil, но тогда XCode просто суетится об условной строке:)

РЕДАКТИРОВАТЬ: Благодаря ответам saadnib и Caleb ниже, это то, что у меня сейчас:

if ([self.navigationController.topViewController isKindOfClass:([UITableViewController class])] ) {
    UITableViewController *topController = (UITableViewController *)self.navigationController.topViewController;
    [topController.tableView setEditing: YES animated: YES];
}

Ответы [ 2 ]

4 голосов
/ 04 апреля 2011

На самом деле вы можете получить доступ к свойству topViewController, задав его тип.Например, ваше имя topViewController - «FirstViewController», тогда вы можете сделать это как

FirstViewController *fvc = (FirstViewController*)self.navigationController.topViewController;

[fvc.tableView setEditing: YES animated: YES];

Я надеюсь, что это поможет вам.

1 голос
/ 04 апреля 2011

Вы получаете ошибку, потому что self.navigationController.topViewController возвращает указатель типа UIViewController*, а UIViewController не имеет свойства tableView. Ответ @ saadnib правильный: если вы знаете, что указатель всегда будет указывать на определенный подкласс UIViewController, вы можете привести его к этому типу.

Однако, даже если вы «знаете», что контроллер верхнего вида всегда будет контроллером табличного представления, вы можете проверить во время выполнения, что это так. Вы можете использовать -isKindOfClass: чтобы увидеть, является ли контроллер подклассом UITableViewController. Тебе, конечно, все еще нужен актерский состав, но это будет немного безопаснее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...