xcode performSegueWithIdentifier 根本不起作用
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10305842/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
performSegueWithIdentifier is NOT Working at all
提问by Neil Faulkner
Hi I'm trying to push to a different view depending what a user selects. I have a table view with 4 other view controllers linked to it via push segues in the story board. All Segues are linked directly to the TableView view controller. Depending on what cell is selected, it loads the corresponding view. Heres the code I'm using:
嗨,我正在尝试根据用户的选择推送到不同的视图。我有一个表视图,其中有 4 个其他视图控制器通过故事板中的 push segues 链接到它。所有 Segue 都直接链接到 TableView 视图控制器。根据选择的单元格,它加载相应的视图。这是我正在使用的代码:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSDictionary *dictionary = [_articles objectAtIndex:indexPath.row];
NSArray *selectedKey = [dictionary objectForKey:@"Key"];
if ([selectedKey isEqual:@"Driver"]){
self.driverDetailView.wikiItem = dictionary;
[self.driverDetailView performSegueWithIdentifier:@"pushDriver" sender:dictionary];
NSLog(@"Push Driver");
}
if ([selectedKey isEqual:@"Team"]) {
NSLog(@"Push Team");
}
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
NSLog(@"Preparing For Segue");
if ([[segue identifier] isEqual:@"pushDriver"]) {
self.driverDetailView=segue.destinationViewController;
}
}
For some reason
因为某些原因
[self.driverDetailView performSegueWithIdentifier:@"pushDriver" sender:dictionary];
NSLog(@"Push Driver");
won't allow me to set as "Self" at the beginning, i get a error saying:
不允许我在开始时设置为“自我”,我收到一条错误消息:
No Visible @interface for TableCell declares the selector performSegueWithIdentifier
TableCell 的 No Visible @interface 声明了选择器 performSegueWithIdentifier
If i use "self.driverDetailView" i don't get a error, but when i select the cell nothing happens.
如果我使用“self.driverDetailView”,我不会收到错误消息,但是当我选择单元格时,什么也没有发生。
Heres the HorizontalTableView.h
这是 HorizontalTableView.h
#import <UIKit/UIKit.h>
#import "HorizontalDetailView.h"
#import "HorizontalTableCell.h"
@interface HorizontalTableView : UITableViewController <UITableViewDelegate, UITableViewDataSource> {
NSDictionary *_articleDictionary;
NSMutableArray *_reusableCells;
}
@property (nonatomic, retain) NSDictionary *articleDictionary;
@property (nonatomic, retain) NSMutableArray *reusableCells;
@end
Heres the HorizontalTableView.m
这是 HorizontalTableView.m
#import "HorizontalTableView.h"
#import "HorizontalTableCell.h"
#import "ControlVariables.h"
#import "HorizontalDetailView.h"
#define kHeadlineSectionHeight 26
#define kRegularSectionHeight 18
@interface HorizontalTableView ()
@end
@implementation HorizontalTableView
@synthesize articleDictionary = _articleDictionary;
@synthesize reusableCells = _reusableCells;
- (void)awakeFromNib{
[self.tableView setBackgroundColor:kVerticalTableBackgroundColor];
self.tableView.rowHeight = kCellHeight + (kRowVerticalPadding * 0.5) + ((kRowVerticalPadding * 0.5) * 0.5);
}
- (id)initWithStyle:(UITableViewStyle)style{
self = [super initWithStyle:style];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad{
[super viewDidLoad];
self.articleDictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"]];
}
- (void)viewDidUnload{
[super viewDidUnload];
self.articleDictionary = nil;
self.reusableCells = nil;
}
- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [self.articleDictionary.allKeys count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"HorizontalCell";
HorizontalTableCell *cell = (HorizontalTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil){
cell = [[HorizontalTableCell alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, tableView.frame.size.height)];
}
NSSortDescriptor* sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:nil ascending:YES selector:@selector(localizedCompare:)];
NSArray* sortedCategories = [self.articleDictionary.allKeys sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
NSString *categoryName = [sortedCategories objectAtIndex:indexPath.section];
NSArray *currentCategory = [self.articleDictionary objectForKey:categoryName];
cell.articles = currentCategory;
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return section == 0 ? kHeadlineSectionHeight : kRegularSectionHeight;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
UIView *customSectionHeaderView;
UILabel *titleLabel;
UIFont *labelFont;
if (section == 0)
{
customSectionHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, kHeadlineSectionHeight)];
titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, tableView.frame.size.width, kHeadlineSectionHeight)];
labelFont = [UIFont boldSystemFontOfSize:20];
}
else
{
customSectionHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, kRegularSectionHeight)];
titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, tableView.frame.size.width, kRegularSectionHeight)];
labelFont = [UIFont boldSystemFontOfSize:14];
}
customSectionHeaderView.backgroundColor = [UIColor colorWithRed:0.01176471 green:0.01176471 blue:0.01960784 alpha:0.95];
titleLabel.textAlignment = UITextAlignmentLeft;
[titleLabel setTextColor:[UIColor whiteColor]];
[titleLabel setBackgroundColor:[UIColor clearColor]];
titleLabel.font = labelFont;
NSSortDescriptor* sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:nil ascending:YES selector:@selector(localizedCompare:)];
NSArray* sortedCategories = [self.articleDictionary.allKeys sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
NSString *categoryName = [sortedCategories objectAtIndex:section];
titleLabel.text = [categoryName substringFromIndex:1];
[customSectionHeaderView addSubview:titleLabel];
return customSectionHeaderView;
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
NSLog(@"Preparing For Segue");
}
@end
The Code for HorizontalTableCell.h is:
HorizontalTableCell.h 的代码是:
#import <UIKit/UIKit.h>
#import "HorizontalDetailView.h"
#import "DriverDetailView.h"
#import "HorizontalTableView.h"
@interface HorizontalTableCell : UITableViewCell <UITableViewDelegate, UITableViewDataSource> {
UITableView *_horizontalTableView;
NSMutableArray *_articles;
HorizontalTableCell *horizontalTableCell;
}
@property (nonatomic, strong) UITableView *horizontalTableView;
@property (nonatomic, strong) NSMutableArray *articles;
@property (nonatomic, strong) HorizontalDetailView *horizontalDetailView;
@property (nonatomic, strong) DriverDetailView *driverDetailView;
@property (nonatomic, strong) HorizontalTableCell *horizontalTableCell;
@end
The code for HorizontalTableCell.m is:
HorizontalTableCell.m 的代码是:
#import "HorizontalTableCell.h"
#import "ControlVariables.h"
#import "ArticleCell.h"
#import "HorizontalDetailView.h"
@implementation HorizontalTableCell
@synthesize horizontalTableView = _horizontalTableView;
@synthesize articles = _articles;
@synthesize horizontalDetailView;
@synthesize driverDetailView;
@synthesize horizontalTableCell;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [self.articles count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";
ArticleCell *cell = (ArticleCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil){
cell = [[ArticleCell alloc] initWithFrame:CGRectMake(0, 0, kCellWidth, kCellHeight)];
}
NSDictionary *currentArticle = [self.articles objectAtIndex:indexPath.row];
cell.thumbnail.image = [UIImage imageNamed:[currentArticle objectForKey:@"Image"]];
cell.titleLabel.text = [currentArticle objectForKey:@"Title"];
return cell;
}
- (void)dealloc{
self.horizontalTableView = nil;
self.articles = nil;
}
- (NSString *) reuseIdentifier{
return @"HorizontalCell";
}
- (id)initWithFrame:(CGRect)frame{
if ((self = [super initWithFrame:frame])){
self.horizontalTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, kCellHeight, kTableLength)];
self.horizontalTableView.showsVerticalScrollIndicator = NO;
self.horizontalTableView.showsHorizontalScrollIndicator = NO;
self.horizontalTableView.transform = CGAffineTransformMakeRotation(-M_PI * 0.5);
[self.horizontalTableView setFrame:CGRectMake(kRowHorizontalPadding * 0.5, kRowVerticalPadding *
0.5, kTableLength - kRowHorizontalPadding, kCellHeight)];
self.horizontalTableView.rowHeight = kCellWidth;
self.horizontalTableView.backgroundColor = kHorizontalTableBackgroundColor;
self.horizontalTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
self.horizontalTableView.separatorColor = [UIColor clearColor];
self.horizontalTableView.dataSource = self;
self.horizontalTableView.delegate = self;
[self addSubview:self.horizontalTableView];
}
return self;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSDictionary *dictionary = [_articles objectAtIndex:indexPath.row];
NSArray *selectedKey = [dictionary objectForKey:@"Key"];
// NSLog(@"Selected Key = %@",selectedKey);
if ([selectedKey isEqual:@"Driver"]){
self.driverDetailView.wikiItem = dictionary;
[self performSegueWithIdentifier:@"pushDriver" sender:self];
NSLog(@"Push Driver");
}
if ([selectedKey isEqual:@"Team"]) {
NSLog(@"Push Team");
}
if ([selectedKey isEqual:@"Tech"]) {
NSLog(@"Push Tech");
}
if ([selectedKey isEqual:@"Track"]) {
NSLog(@"Push Track");
}
//self.horizontalDetailView.wikiItem = dictionary;
// NSLog(@"selected Array = %@",dictionary);
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
NSLog(@"Preparing For Segue");
if ([[segue identifier] isEqual:@"pushDriver"]) {
self.driverDetailView=segue.destinationViewController;
}
}
@end
采纳答案by geraldWilliam
If I understand you correctly, you have your segues hooked up to table view cells. If that's right, I would suggest hooking them from the view controller itself to the destination view controllers and then calling [self performSegueWithIdentifier:@"pushDriver"];
in your didSelectRowAtIndexPath:
method.
如果我理解正确的话,你的 segue 已经连接到表格视图单元格了。如果是这样,我建议将它们从视图控制器本身连接到目标视图控制器,然后调用[self performSegueWithIdentifier:@"pushDriver"];
您的didSelectRowAtIndexPath:
方法。