2014-10-03 2 views
0

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

GamesInfoViewController.m

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
if ([[segue identifier] isEqualToString:@"ShowDetails"]) { 
    DetailViewController2 *detailViewController = [segue destinationViewController]; 

    NSIndexPath *myIndexPath = [self.tableView indexPathForSelectedRow]; 

    NSUInteger row = [myIndexPath row]; 
    GameInfo *gameInfoObject; 

    gameInfoObject =[GamesInfoArray objectAtIndex:row]; 
    detailViewController.DetailArray = @[gameInfoObject.HomeTeam, gameInfoObject.AwayTeam]; // IT CRASHES HERE!!! 
} 

} 

А вот DetailViewController2.m

- (void)viewDidLoad { 
[super viewDidLoad]; 

// Uncomment the following line to preserve selection between presentations. 
// self.clearsSelectionOnViewWillAppear = NO; 

// Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
// self.navigationItem.rightBarButtonItem = self.editButtonItem; 

[self.tableView reloadData]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
GamesInfoTableViewCell *cell = (GamesInfoTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"MainCell"]; 

cell.mainLabel.text = _DetailArray[0]; 
cell.awayTeamLabel.text = _DetailArray[1]; 

// Configure the cell... 

return cell; 

}

DetailViewController2.h

#import <UIKit/UIKit.h> 

@interface DetailViewController2 : UITableViewController 

@property (strong, nonatomic) NSArray *DetailArray; 
@end 

И ДА я выбрал D etailViewController2 как пользовательский класс в раскадровке !!!

Сообщение об ошибке: 'NSInvalidArgumentException', причина: '- [UINavigationController setDetailArray]: непризнанные селектор направлен например 0x7fa65a537f00'

+0

Пожалуйста, разместите селектор, который не был распознан. – F1ank3r

+0

Пожалуйста, разместите сообщение об ошибке, которое вы получаете. – Popeye

+0

Добавлено в нижнюю часть вопроса! –

ответ

6

Кажется, что эта линия

DetailViewController2 *detailViewController = [segue destinationViewController]; 

возвращает UINavigationController и не DetailViewController2

Если DetailViewController2 встроен в UINavigationController Вы, вероятно, хотите сделать что-то вроде:

UINavigationController *navController = [segue destinationViewController]; 
DetailViewController2 *detailViewController = (DetailViewController2 *)navController.topViewController; 

если DetailViewController2 является подклассом UINavigationController вы, возможно, забыли явно сказать, что в вашей раскадровке.

+0

Он работал с вашим кодом, но это дает мне ошибку, почему? Несовместимые типы указателей, инициализирующие 'DetailViewController2 *' с выражением типа 'UIViewController *' @KIDdAe –

+0

Я отредактировал свой ответ, чтобы удалить это предупреждение. Вы получили его, потому что компилятор знает, что 'navController.topViewController' является' UIViewController', но в этот момент он не может быть уверен, что он также является «DetailViewController2», поэтому он предупреждает вас, что здесь вы можете иметь ошибку. – KIDdAe

+0

Работал как шарм! Еще раз спасибо. –

1

KIDdAe s совершенно правильно DetailViewController2 *detailViewController = [segue destinationViewController]; возвращается в UINavigationController, а не DetailViewController2 мой ответ более чистым из существующего кода, и я также добавить в ответ.

GamesInfoViewController.m

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"ShowDetails"]) { 
     // [segue returns a UINavigationController and the controller you 
     // want is embedded in the navigation controller 
     UINavigationController *navigationController = [segue destinationViewController]; 

     // We want the top view controller from the navigationController 
     // and don't forget the cast 
     DetailViewController2 *detailViewController = (DetailViewController2 *)navigationController.topViewController; 



     // Removed redundant line as there was no need to create local variable for 
     // one time use 
     NSUInteger row = [[self.tableView indexPathForSelectedRow] row]; 

     // There was no need to have these two on on separate lines 
     GameInfo *gameInfoObject = [GamesInfoArray objectAtIndex:row]; 

     // To add a fail safe you could wrap this in respondsToSelector 
     // just in the event that the topViewController isn't a DetailViewController2 
     if ([detailViewController respondsToSelector:@selector(setDetailArray:)]) { 
      // Note the lowercase for detailArray see comments above this property. 
      detailViewController.detailArray = @[gameInfoObject.HomeTeam, gameInfoObject.AwayTeam]; 
     } 
    } 
} 

DetailViewController2.h

#import <UIKit/UIKit.h> 

@interface DetailViewController2 : UITableViewController 

// Properties and ivars start with lowercases classes have uppercases 
// try to stay to coding conventions it will help you and others when needing help 
@property (strong, nonatomic) NSArray *detailArray; 

@end 

DetailViewController2.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Uncomment the following line to preserve selection between presentations. 
    // self.clearsSelectionOnViewWillAppear = NO; 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem; 

    [self.tableView reloadData]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    GamesInfoTableViewCell *cell = (GamesInfoTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"MainCell"]; 

    cell.mainLabel.text = _detailArray[0]; 
    cell.awayTeamLabel.text = _detailArray[1]; 

    // Configure the cell... 

    return cell; 
} 

Если вы прочтете комментарии в ответе, вы увидите, почему я изменил ситуацию к лучшему. Если у вас есть какие либо вопросы, пожалуйста спрашивайте.

+0

Красивые :), Спасибо, что комментировали, почему вы делали что-то. Только один вопрос, который может быть не связан с вашим кодом, но если у меня есть другое представление таблицы, которое будет показывать то же самое, что и DetailViewController2. Должен ли я сделать другой контроллер навигации с табличным представлением таким же, как DetailViewController2, или я могу подключить его к одному классу? –

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