2015-03-11 2 views
0

Мое приложение отключается из-за непризнанного селектора, отправленного с помощью segue. Я знаю, что это обычный вопрос в stackoverflow. Я пробовал все решения, но не смог пройти через это. Я думаю, что я что-то упустил. Мой текущий проект выбрасывает это исключение, но новый проект с этим же кодом не вызывает никаких исключений. Зачем ? Я попробовал как ниже фрагмент кода передать данные из FirstViewController в DetailViewController с помощью segue.Ошибка приложения из-за непризнанного селектора, отправленного на VC

В моем файле FirstViewController.h:

#import <UIKit/UIKit.h> 
#import "DetailViewController.h" 

@interface FirstViewController : UIViewController<UITableViewDataSource, UITableViewDelegate> 

@end 

В моем файле FirstViewController.m:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    //if ([segue.identifier isEqualToString:@"detail"]) { 
     DetailViewController *vc = (DetailViewController *)[segue destinationViewController]; 
     vc.nameStr = @"Nuibb"; 
    //} 
} 

В моем файле DetailViewController.h:

#import <UIKit/UIKit.h> 

@interface DetailViewController : UIViewController 
@property (nonatomic, strong) NSString *nameStr; 
@end 

В моей DetailViewController. м файл:

#import "DetailViewController.h" 

@interface DetailViewController() 
@property (weak, nonatomic) IBOutlet UILabel *label; 

@end 

@implementation DetailViewController 
@synthesize nameStr; 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    self.label.text = nameStr; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

И я получаю сообщение об ошибке в журнале -

2015-03-11 10:27:24.145 bdipo[1185:18722] -[UINavigationController setNameStr:]: unrecognized selector sent to instance 0x7fe928dad8c0 
2015-03-11 10:27:24.147 bdipo[1185:18722] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UINavigationController setNameStr:]: unrecognized selector sent to instance 0x7fe928dad8c0' 
+0

Посмотрите на свой пункт назначения «destinationViewController» вашего segue. Вероятно, это не «DetailViewController», как то, к чему вы его придумали. –

+0

может быть [segue destinationViewController] является UINavigationController, а не DetailViewController, поэтому у него нет свойства nameStr –

+0

Фактически между FirstViewController и DetailViewController в моей раскадровке есть контроллер навигации. Теперь что мне делать? – Nuibb

ответ

1

Вам нужно только один навигационный контроллер в любом приложении, которое загружает в момент запуска и будет обрабатывать навигации полного стека контроллеров представлений для вас. Он должен быть контроллером корневого представления с флажком «Исходный контроллер просмотра» (в разделе «Инспектор атрибутов», «Контроллер просмотра»), чтобы дать ему стрелку начала, указывающую на левую сторону представления.

enter image description here

Если предположить, что NewsTVC является первым контроллером представления вы хотите, чтобы показать, удалить контроллер представления навигации в раскадровке. Выберите NewsTVC, перейдите на панель инструментов XCode и выберите «Редактор -> Вставить -> Контроллер навигации».

enter image description here

Навигационный контроллер будет создан, что перетекает в ваш NewsTVC. Убедитесь, что для нового контроллера навигации выбран «Исходный контроллер просмотра», и перетащите новый сегмент между ячейкой прототипа NewsTVC и DetailVC. Это должно организовать ваш стек, так что segue работает правильно.

enter image description here

+0

И также переопределите метод prepareForSegue в вашем NewsTVC, как указал Свет Ягами. Вы обнаружите, что он прокомментирован в нижней части кода реализации плиты котла при создании пользовательского файла класса UITableViewController. – markedwardmurray

+0

На самом деле у меня нет начального контроллера корневого представления. Потому что в первый раз пользователь переходит на экран входа в систему, после чего он всегда запускает приложение из контроллера табуляции, не видя этого экрана входа в систему. Я обрабатываю это в файле appdelegate. – Nuibb

+0

[это (25% шкала)] (https://www.dropbox.com/s/dbwaqmmsapcfadq/Screenshot%202015-03-11%2012.02.43.png?dl=0) и [это (50%)] (https://www.dropbox.com/s/60nj3d2eu0rt0tc/Screenshot%202015-03-11%2012.02.23.png?dl=0) - это скриншот полной раскадровки. Перед каждым контроллером просмотра каждой вкладки в моей раскадровке я просто внедряю контроллер навигации из редактора> Embed In> Navigation Controller. Разве это не правильно? Пожалуйста, дайте мне знать, если я ошибаюсь. Благодарю. – Nuibb

1

Вы можете получить доступ к вашему взгляду, как показано ниже

DetailViewController *detailVC = 
     [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];//modify this identifier name as per your StoryBoardIDentifier for detailview at storyboard.. 
[email protected]"Nuibb"; 
[self.navigationController pushViewController:detailVC animated:NO];//if you want to push to detail view from first view 

Надеется, что это помогает ...

1

V1 (segue name = xyz) -> NavController -> (ROOT) VC2

В вашем vc1's didselectforRowAtIndexPath или любом другом методе действий wr ite этот код.

[self performSegueWithIdentifire:@"xyz"]; 

Затем переопределить метод -

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
if ([segue.identifier isEqualToString:@"xyz"]) { 
    DetailViewController *vc = (DetailViewController *)[segue destinationViewController]; 
    vc.nameStr = @"Nuibb"; 
} 
} 

Внутри DetailViewController.h объявить свойство первой.

@property(nonatomic,strong)NSString *nameStr; 
0

На tableViewdidSelectRowAtIndexUINavigationController является segued в соответствии с вашим раскадровки и ваш navigationController не имея свойство с именем nameStr

Вы должны непосредственно перейти detailViewController прямой. Поскольку UINavigationController не может перемещаться в навигацию.

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