2015-05-03 76 views
-2

我有这个Segue公司在这里:Objective-C的问题与Segue公司

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([[segue identifier] isEqualToString:@"showDetail"]) { 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     //NSDate *object = self.objects[indexPath.row]; 
     NSString *strPOIndex = [self.tableData[indexPath.row] valueForKey:@"POIndex"]; 
     LHPurchaseOrderDetail *controller = (LHPurchaseOrderDetail *)[[segue destinationViewController] topViewController]; 
     [controller setDetailItem:strPOIndex]; 
     controller.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem; 
     controller.navigationItem.leftItemsSupplementBackButton = YES; 
    } 
} 

和我试图用它做的是通过strPOIndex从我的主控制器我的详细控制器setDetailItem ..但是当我运行这个,我得到一个错误:

-[LHPurchaseOrderMaster setDetailItem:]: unrecognized selector sent to instance 0x156cce80 

我不明白为什么会发生这种情况,这是我的故事板的问题?或我的主控制器或细节控制器?这里是我的详细信息控制器:

.H:

#import <UIKit/UIKit.h> 

@interface LHPurchaseOrderDetail : UIViewController 

@property (strong, nonatomic) IBOutlet UINavigationBar *NavBar; 
@property (strong, nonatomic) id detailItem; 
@property (weak, nonatomic) IBOutlet UILabel *detailDescriptionLabel; 

@end 

.M:

#import "LHPurchaseOrderDetail.h" 

@interface LHPurchaseOrderDetail() 

@end 

@implementation LHPurchaseOrderDetail 

- (void)setDetailItem:(id)newDetailItem { 
    if (_detailItem != newDetailItem) { 
     _detailItem = newDetailItem; 

     // Update the view. 
     [self configureView]; 
    } 
} 

- (void)configureView { 
    // Update the user interface for the detail item. 
    if (self.detailItem) { 
     self.detailDescriptionLabel.text = [self.detailItem description]; 
    } 
} 


- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self configureView]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
} 


@end 

主控制器:

.H

#import <UIKit/UIKit.h> 
#import "ShinobiDataSource.h" 
#import "PopupGenerator.h" 

@class LHPurchaseOrderDetail; 

@interface LHPurchaseOrderMaster : UITableViewController<UIPopoverControllerDelegate, UIPickerViewDelegate> 


@property (strong, nonatomic) IBOutlet UIButton *communityBtn; 
@property (strong, nonatomic) IBOutlet UIButton *lotBtn; 
@property (strong, nonatomic) IBOutlet UIButton *goBtn; 


- (IBAction)communityBtnPressed:(id)sender; 
- (IBAction)lotBtnPressed:(id)sender; 
- (IBAction)goBtnPressed:(id)sender; 

@property(nonatomic, retain) NSArray * tableData; 
@property (strong, nonatomic) LHPurchaseOrderDetail *purchaseOrderController; 


@end 
+1

你确定topViewController是LHPurchaseOrderDetail类型吗?尝试调试线路,看看返回的真实类型 – giorashc

+0

您是否尝试过使用'LHPurchaseOrderDetail * controller =(LHPurchaseOrderDetail *)[segue destinationViewController];'!?你为什么要访问'topViewController'属性? – luk2302

+0

@ luk2302我想他正在访问'topViewController'属性,因为他的UIViewController嵌入在UINavigationController中,并且segue对应于navigationController(因此为cast)。 – Razvan

回答

-1

看来,您尝试访问的财产不是交流可接受的(错误的检索对象)。

您是否尝试过使用,而不是

LHPurchaseOrderDetail *controller = (LHPurchaseOrderDetail *)[[segue destinationViewController] topViewController]; 

喜欢的东西

LHPurchaseOrderDetail *controller = (LHPurchaseOrderDetail *)[[segue destinationViewController] viewControllers][0]; 

我有时同您的问题。

+0

不,如果不能访问,会发生不同的错误! – luk2302

+0

对不起,也许我没有正确表达。对于“不可访问”,我的意思是没有该属性或方法的对象。当您尝试在没有该方法的对象中调用方法时,会发生这种情况。 –

+0

好的,这是肯定的,但它并没有真正帮助解决问题(我btw不是那个投票给你的人。) – luk2302

-1

将您的detailItem设置为NSString。不是身份证。问题就在这里,

self.detailDescriptionLabel.text = [self.detailItem description]; 

configureView方法更改代码如下,

- (void)configureView { 
    // Update the user interface for the detail item. 
    if (self.detailItem) { 
     self.detailDescriptionLabel.text = self.detailItem; 
    } 
} 

不要忘记改变这个为好,

- (void)setDetailItem:(NSString *)newDetailItem { 
    if (_detailItem != newDetailItem) { 
     _detailItem = newDetailItem; 

     // Update the view. 
     [self configureView]; 
    } 
} 
0

你的错误是这样的:

-[LHPurchaseOrderMaster setDetailItem:]: unrecognized selector sent to instance 0x156cce80 

所以看起来你试图访问LHPurchaseOrderMaster类的某个地方,并将detailItem属性设置为LHPurchaseOrderMaster的一部分,但因为它不存在,所以会出现unrecognized selector错误。

编辑

您应该检查三两件事:

  1. Interface Builder检查,从LHPurchaseOrderMaster的ViewController的SEGUE是一个UINavigationController嵌入了LHPurchaseOrderDetail的ViewController在第一视图控制器其叠加。

  2. 检查由[segue destinationViewController]topViewController]这样返回的类名称:

    id obj = [segue destinationViewController]topViewController]; NSLog(@"%@", NSStringFromClass([obj class]));

类的名称应该是LHPurchaseOrderDetail。如果不是这样,那么你的故事板中有一个问题,当然你不是错误地将连线连接起来。

  1. 请检查您的LHPurchaseOrderMaster类是否有任何试图访问“detailItem”属性的代码,就好像它是该类的一部分一样。