Как ссылаться на tableView из контроллера представления во время перехода - PullRequest
9 голосов
/ 28 октября 2011

Я новичок в разработке для iOS, поэтому, пожалуйста, будьте осторожны со мной:)

Используя Xcode 4.2 для iOS 5, я построил контроллер представления в IB, с табличным представлением внутри, связанным с контроллером подробного представления посредством push-перехода (на уровне ячейки табличного представления)

Я хочу настроить метки страниц с данными из моего источника данных на основе индекса выбранной ячейки. Первоначально я закодировал «didSelectRowAtIndexPath» только для того, чтобы выяснить, что это вызывается после обработки segue, и обнаружил, что вместо этого нужно вызвать prepareForSegue

Моя проблема в том, что что бы я ни пытался, так как tableView не является переданным параметром prepareForSegue (в отличие от большинства других методов, которые я использовал до сих пор), я пытаюсь получить доступ к tableView в контроллере представления, чтобы вызвать метод indexPath, чтобы я мог ссылаться на мой источник данных

Я видел много примеров использования self, как показано ниже, но это приводит к ошибке, утверждающей, что tableView не существует в контроллере представления

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

  NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
  DetailViewController *detail = [segue destinationViewController];
  detail.primary = [datasource objectAtIndex:selectedIndexPath.row];
  detail.seconday = [datalist objectForKey:detail.primary];
}

Я также пытался использовать

ViewController *main = [segue viewController];

Вместо использования self, но это приводит к той же проблеме

Я знаю, что вместо этого мог бы переписать пример в качестве контроллера табличного представления, но хотел бы знать, возможно ли это таким образом? Как я видел, люди используют оба метода в разработке

Для справки, я следовал этому уроку ... http://kurrytran.blogspot.com/2011/10/ios-5-storyboard-and.html

Когда я добрался до раздела для заполнения страницы сведений, я подумал, почему бы не использовать переход, чтобы связать ячейку табличного представления со страницей сведений, а затем скопировать код состояния и заглавной буквы до появления страницы сведений. отображается. Как вы можете видеть из этого урока, основным контроллером является контроллер вида

Насколько я понимаю, НЕ использование UITableViewController даст любому приложению большую гибкость, если в дальнейшем ему понадобится что-то более сложное

Надеюсь, вы можете помочь, Иззи

Ответы [ 4 ]

9 голосов
/ 02 ноября 2011

Я также новичок в iOS, но за то, что он стоит:

Похоже, вам нужно создать указатель на ваш объект табличного представления в вашем UIViewControllerClass.

@interface YourClass : UIViewController
{
    IBOutlet UITableView  *MyTableView;
}
@property ... IBOutlet UITableView *MyTableView;

...и затем подключите это к вашему «представлению таблицы» в IB.Так что в prepareForSegue вы можете получить доступ к объекту UITableView.

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath *selectedIndexPath = [self.MyTableView indexPathForSelectedRow];
    ...
}
2 голосов
/ 03 ноября 2015

ОБНОВЛЕНИЕ SWIFT 2

Я «подключил» tableView как выход из раскадровки в ViewController.

как это: @IBOutlet weak var tableView: UITableView!

Просто перетащите свой tableView в ViewController и сделайте его розеткой. Затем вы можете ссылаться на его свойства, такие как self.tableView.reloadData().

Это свойство, как и другие, которые ссылались на tableView, давало мне ошибки, пока я не добавил tableView в качестве ссылки.

Добавьте это к вашему классу: class TableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

Теперь должен работать indexPath.row, а также сегменты. Вы также можете использовать instantiateViewControllerWithIdentifier так:

  func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        let myOtherView = self.storyboard!.instantiateViewControllerWithIdentifier("otherViewController") as! otherViewViewController


            myOtherView.url = NSURL(string:"\(array[indexPath.row])")

            self.presentViewController(myOtherView, animated: true, completion: nil)


    }

Надеюсь, это поможет.

1 голос
/ 16 февраля 2012

После:

DetailViewController *detail = [segue destinationViewController];

вставлено:

[detail view];

тогда:

detail.primary = [datasource objectAtIndex:selectedIndexPath.row];

detail.seconday = [datalist objectForKey:detail.primary];

По какой-то причине просто установить segue недостаточно, чтобы правильно настроить все свойства. Вы должны добавить просмотр вызовов в свой приемник ViewController.

1 голос
/ 30 октября 2011

Я также новичок в iOS, но для чего это стоит:

NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];

работал для меня в prepareForSegue.Спасибо, я пытался выяснить, как получить текущую выбранную строку ...

Я не уверен, что вы подразумеваете под "Я построил контроллер представления в IB с табличным видом внутри",но похоже, что ваш источник segue является UIViewController, а не UITableViewController?Ваш класс должен иметь подкласс UITableViewController для существования tableView.

...