Ios 将id从解析表视图传递到详细视图

Ios 将id从解析表视图传递到详细视图,ios,objective-c,Ios,Objective C,(我知道以前有人问过这个问题,但不幸的是,在试图解决这个问题的过程中,我查看并尝试过的所有相关答案都不适用于我。如果有任何帮助,我将不胜感激。) 我正在构建一个简单的新闻应用程序。打开的屏幕使用Parse的API获取最新的新闻条目 当您点击菜单按钮时,您可以查看过去几天的新闻: 我希望能够将id从选定的解析表单元格传递回主视图 我在滑动菜单中使用ECSlidingViewController,在各种屏幕中使用故事板: 但由于我使用ECSlidingViewController的方式,我无法

(我知道以前有人问过这个问题,但不幸的是,在试图解决这个问题的过程中,我查看并尝试过的所有相关答案都不适用于我。如果有任何帮助,我将不胜感激。)

我正在构建一个简单的新闻应用程序。打开的屏幕使用Parse的API获取最新的新闻条目

当您点击菜单按钮时,您可以查看过去几天的新闻:

我希望能够将id从选定的解析表单元格传递回主视图

我在滑动菜单中使用ECSlidingViewController,在各种屏幕中使用故事板:

但由于我使用ECSlidingViewController的方式,我无法像其他方式那样通过segues传递数据,所以我尝试通过带有自定义init的视图控制器传递数据

这是我的MainViewController.h代码:

@interface MainViewController : UIViewController

@property (nonatomic) NSString *detailId;

- (id)initWithDetailId:(NSString*)theId;

@end
这是我在MenuViewController.m中的
didselectrowatinexpath
代码:

MainViewController *mainVC = [[MainViewController alloc] initWithDetailId:@"test"];
[self.navigationController pushViewController:mainVC animated:YES];
这是MainViewController.m的
initWithDetailId

- (id)initWithDetailId:(NSString*)theId
{
    NSLog(@"initWithDetailId");
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        detailId = theId;
    }
    return self;
}
这里是MainViewController.m的
viewDidLoad

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"detailId equals: %@", self.detailId);
}

但我从NSLog中得到的只是“detailId等于:(null)”。我做错了什么?谢谢

你忘了把
self.
放在
detailId=theId前面

self.detailId = theId;
就是

- (id)initWithDetailId:(NSString*)theId
{
    NSLog(@"initWithDetailId");
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
    self.detailId = theId;
    }
    return self;
}
有另一种方法可以做到这一点:

MainViewController *mainVC = [self.storyBoard instantiateViewControllerWithIdentifier:@"yourIdentifier"];
mainVc.detailId=@"test";
[self.navigationController pushViewController:mainVC animated:YES];

在视图控制器之间传递数据的最佳答案是:基本思想是您应该在原型单元和主视图控制器之间创建一个分段,使用
prepareForSegue
destinationController
中设置
detailId
,如另一篇文章所述,然后退出当前的
didSelectRowAtIndexPath
。Rob,我以前试过,因为我尝试构建这个应用程序的方式(默认情况下主视图显示一个视图,然后您访问表视图的菜单),我没有导航控制器。我不需要一个来使用segues吗?如果我没记错的话,我之前在尝试
prepareForSegue
时遇到了一个错误,说我需要一个导航控制器。您可能会混淆两个完全不同的问题。是否使用segues与是否使用导航控制器无关。不过,如果您想使用推送序列,则需要导航控制器。(如果您像上面的代码一样使用
pushViewController
,您也需要导航控制器!)但是,如果您使用模态分段,则不需要导航控制器(并且,在代码中,您应该显示/关闭控制器,而不是推/弹出控制器)。我支持segues,因为它直观地代表了应用程序的流程,简化了代码。您可以完全摆脱
initWithDetailId
方法,并在Ravindra回答的后半部分中使用该技术。我仍然认为使用segue更优雅(将segue从cell prototype添加到下一个场景,消除
DidSelectRowatineXpath
方法,在
prepareForSegue
中设置
detailID
),但确保您可以通过
实例化设备控制器的标识符来手动创建目的地,就像Ravendra建议的,首先,终于让它工作了!非常感谢,伙计们。就像你说的那样,我不需要initWithDetailId,我从ECSlidingViewController获得了额外的UIViewController。这段代码非常有用:
MainViewController*newTopViewController=[self.storyboard instanceeviewController的标识符:@“Main”];newTopViewController.detailId=@“测试”。还有,Rob,你的见解帮助我更多地了解了如何最好地构建iOS应用程序,再次感谢。不幸的是,添加了self。对detailId没有帮助。我以前已经试过两种方法了。(我在前面的问题中看到过,因此实际上不使用self.in init?@RavindraBagale+1是更好的语法,用于建议
instanceeviewcontrollerwhiteIdentifier
)-1用于建议在
initWithDetailId
方法中使用访问器方法(请参阅)。如果您编辑您的答案以避免在
initWithDetailId
中使用
self.detailID
的建议,我很乐意为您的答案投票。