Ios Segue的Objective-C问题

Ios Segue的Objective-C问题,ios,objective-c,segue,Ios,Objective C,Segue,我这里有一段话: - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"showDetail"]) { NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; //NSDate *object = self.o

我这里有一段话:

- (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:

主控制器:

h

#导入
#导入“ShinobiDataSource.h”
#导入“PopupGenerator.h”
@类LHPurchaseOrderDetail;
@界面LHPurchaseOrderMaster:UITableViewController
@属性(强,非原子)IBUIButton*communityBtn;
@属性(强,非原子)ibuibutton*lotBtn;
@属性(强,非原子)IBUIButton*goBtn;
-(iAction)社区B表示:(id)发件人;
-(IBAction)lotBtnPressed:(id)发送方;
-(iAction)已按下:(id)发送方;
@属性(非原子,保留)NSArray*tableData;
@属性(强,非原子)lPurchaseOrderDetail*purchaseOrderController;
@结束

您试图访问的属性似乎无法访问(检索到的对象错误)

你有没有试过使用而不是

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

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

有时我也会遇到与您相同的问题。

将您的
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];
    }
}
您的错误是:

-[LHPurchaseOrderMaster setDetailItem:]: unrecognized selector sent to instance 0x156cce80
因此,似乎在
lPurchaseOrderMaster
类中的某个地方,您试图访问并设置
detailItem
属性,就好像它是
lPurchaseOrderMaster
的一部分一样,但由于它不存在,因此出现了一个
无法识别的选择器
错误

编辑

你应该检查三件事:

  • Interface Builder
    中,检查从
    LHPurchaseOrderMaster
    ViewController到
    UINavigationController
    的序列是否将
    LHPurchaseOrderDetail
    ViewController作为其堆栈中的第一个视图控制器嵌入

  • 检查
    [segue destinationViewController]topViewController]
    返回的类名,如下所示:

    id obj=[segue destinationViewController]topViewController];
    NSLog(@“%@”、NSStringFromClass([obj类])

  • 类名应为
    LHPurchaseOrderDetail
    。如果不是,那么你的故事板就有问题了,你肯定把情节连接错了

  • 检查您的
    lPurchaseOrderMaster
    类中是否有任何试图访问“detailItem”属性的代码,就好像它是此类的一部分一样

  • 您确定topViewController是LHPurchaseOrderDetail类型吗?尝试调试该行并查看返回的实际类型是什么您是否尝试过使用'lPurchaseOrderDetail*控制器=(lPurchaseOrderDetail*)[segue destinationViewController]<代码>!?你为什么要访问
    topViewController`属性?@luk2302我猜他正在访问topViewController属性,因为他的UIViewController嵌入在一个UINavigationController中,而segue是到那个navigationController的(因此是演员)。黑暗中的镜头太多了<代码>NSLog(@“目标vc%@,[segue destinationViewController])然后
    NSLog(@“目标vc%@”,[[segue destinationViewController]topViewController])在这里发布结果。通过将destinationVC表达式的结果强制转换为显然不是的结果,代码显然是在冒险。@danh如果每个人都在呼救之前开始日志记录和调试,那就容易多了……不,如果无法访问,就会发生另一个错误!对不起,也许我表达得不对。对于“不可访问”,我指的是没有该属性或方法的对象。当你试图在一个没有该方法的对象中调用一个方法时,就会发生这种情况。好吧,这是肯定的,但这对解决问题没有帮助(顺便说一句,我不是那个投票反对你的人。)有时候我只是用那个方法解决了问题。我只是想帮忙。:)
    
    - (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];
        }
    }
    
    -[LHPurchaseOrderMaster setDetailItem:]: unrecognized selector sent to instance 0x156cce80