3

В простом тестовом приложении я попытался передать объект массива с именем «thisArray» из MasterViewController в строку с именем «passData» в DetailViewController. Я использую Storyboards, и UIViewController встроены в контроллер навигации. Используя метод prepareForSegue, я успешно прошел данные между UIViewController:Передача данных между диспетчерами просмотров DidSelectRowsAtIndexPath Storyboards

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"pushData"]) { 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     DetailViewController *destViewController = segue.destinationViewController; 
     destViewController.passedData = [thisArray objectAtIndex:indexPath.row]; 
    } 
} 

Теперь по некоторым причинам я хочу использовать didSelectRowsAtIndexPath вместо prepareForSegue. Я использовал это:

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSMutableString *object = thisArray[indexPath.row]; 
    detailViewController.passedData = object; 
} 

Но это не сработало. Я использовал следующее:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; 

    NSMutableString *object = thisArray[indexPath.row]; 
    detailViewController.passedData = object; 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
} 

Но это также не сработало.

ВОПРОС:

1) Как правильно написать didSelectRowsAtIndexPath заменить prepareForSegue?

2) Если я использую didSelectRowsAtIndexPath, мне нужно, чтобы удалить соединение SEGUE между UIViewController в раскадровке?

3) Что делать, если нет действительно никакой связи между Segue контроллерами зрения, как я могу по-прежнему передавать данные между ними с помощью didSelectRowAtIndexPath?

Спасибо!

UPDATE: На основании ответа и замечании я получил, я написал следующее:

Сначала я удалил связь SEGUE между контроллерами, установите раскадровку идентификатор DetailViewController, название класса также DetailViewController.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UIStoryboard* sb = [UIStoryboard storyboardWithName:@"DetailViewController" 
                bundle:nil]; 
    UIViewController* vc = [sb instantiateViewControllerWithIdentifier:@"DetailViewController"]; 

    NSMutableString *object = thisArray[indexPath.row]; 
    detailViewController.passedData = object; 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
} 

, но его получение разбился со следующей ошибкой:

*** Terminating app due to uncaught exception NSInvalidArgumentException , reason: 'Could not find a storyboard named DetailViewController in bundle

+0

знакомства dasblinkenlight в ниже, и изменить свой обновленный код его. Он должен позаботиться о том, что вы пытаетесь сделать!:) – lnafziger

+0

да его сделано. благодаря! – AJ112

ответ

10

Ваша вторая попытка почти сразу же. Единственное, что не совсем корректно, это то, как вы создаете контроллер представлений из раскадровки: вы используете initWithNibNamed:, что вы используете с NIB, но не с раскадными версиями. Для раскадровки, вам это нужно:

UIStoryboard* sb = [UIStoryboard storyboardWithName:@"theStoryboardId" 
              bundle:nil]; 
// If this code is inside a method called by a controller that is itself instantiated 
// from a storyboard, you can replace the above line with this.storyboard 
UIViewController* detailViewController = [sb instantiateViewControllerWithIdentifier:@"DetailViewController"]; 

См this question подробности.

После того, как вы сделаете замену, ваш код должен работать должным образом.

EDIT:: Вот как ваш метод будет выглядеть: редактировать

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UIViewController* detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"]; 
    NSMutableString *object = thisArray[indexPath.row]; 
    detailViewController.passedData = object; 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
} 
+2

Очевидно, что этот синтаксис полезен при переходе на другую раскадровку. Но если та же самая раскадровка, просто используйте 'self.storyboard', например,' UIViewController * vc = [self.storyboard instantiateViewControllerWithIdentifier: @ "DetailViewController"]; ' – Rob

+0

следует ли просто удалить соединение segue между этими контроллерами? и как использовать «vc» для передачи данных? – AJ112

+0

@ AJ112 Да, вам нужно удалить segue. Остальная часть вашего метода не изменяется, начиная с использования 'detailViewController.passedData = object;' для передачи данных. – dasblinkenlight

Смежные вопросы