Ios 将id从解析表视图传递到详细视图
(我知道以前有人问过这个问题,但不幸的是,在试图解决这个问题的过程中,我查看并尝试过的所有相关答案都不适用于我。如果有任何帮助,我将不胜感激。) 我正在构建一个简单的新闻应用程序。打开的屏幕使用Parse的API获取最新的新闻条目 当您点击菜单按钮时,您可以查看过去几天的新闻: 我希望能够将id从选定的解析表单元格传递回主视图 我在滑动菜单中使用ECSlidingViewController,在各种屏幕中使用故事板: 但由于我使用ECSlidingViewController的方式,我无法像其他方式那样通过segues传递数据,所以我尝试通过带有自定义init的视图控制器传递数据 这是我的MainViewController.h代码:Ios 将id从解析表视图传递到详细视图,ios,objective-c,Ios,Objective C,(我知道以前有人问过这个问题,但不幸的是,在试图解决这个问题的过程中,我查看并尝试过的所有相关答案都不适用于我。如果有任何帮助,我将不胜感激。) 我正在构建一个简单的新闻应用程序。打开的屏幕使用Parse的API获取最新的新闻条目 当您点击菜单按钮时,您可以查看过去几天的新闻: 我希望能够将id从选定的解析表单元格传递回主视图 我在滑动菜单中使用ECSlidingViewController,在各种屏幕中使用故事板: 但由于我使用ECSlidingViewController的方式,我无法
@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
的建议,我很乐意为您的答案投票。