嗨我有一个基于导航栏的应用程序,它有一个根视图控制器,可以推送一个表视图。我想从中选择一个值并更改一个单元格的textlabel.text.But我无法取回值?我试过将nsstring作为rootviewcontroller中的一个变量,所以我改变它但我无法在secondviewcontroller中访问它。
并且它不接受self.navigationcontroller.parentviewcontroller.myTableview
它说uiview控制器没有myTableview ...
感谢
答案 0 :(得分:1)
除非是从共享单例中请求,否则不应让推送的视图控制器请求所需的信息。
根视图控制器已经知道如何创建第二个视图控制器并将其推送到导航堆栈。这是添加更多所需信息的正确位置。可能有这样的东西(我假设根视图控制器是UITableViewController
):
-(void)tableView:(UITableView*)tv didSelectRowAtIndexPath:(NSIndexPath*)ip;
{
UIViewController* vc = [[[MyViewController alloc] initWithRequiredString:
self.someStateString] autorelease];
[self.navigationController pushViewController:vc
animated:YES];
}
如果情况发生变化,这种方式MyViewController
不需要更改。例如,如果将应用程序制作为通用iPhone / iPad应用程序,则不应按下视图控制器,而应将其设置为UISplitViewController
的右侧详细视图。这将是唯一需要的改变:
-(void)tableView:(UITableView*)tv didSelectRowAtIndexPath:(NSIndexPath*)ip;
{
UIViewController* vc = [[[MyViewController alloc] initWithRequiredString:
self.someStateString] autorelease];
if ([self isPad]) {
NSArray* vcs = [NSArray arrayWithObject:self, vc, nil];
self.splitViewController.viewControllers = vcs;
} else {
[self.navigationController pushViewController:vc
animated:YES];
}
}
答案 1 :(得分:0)
1 - 您需要告诉编译器“parentViewController”的完整类型
[(YourViewControllerClass*) (self.navigationcontroller.parentviewcontroller) myTableView]
2 - parentViewController
不是导航控制器堆栈上的前一个视图控制器。使用导航控制器的viewControllers
属性。它包含堆栈中的视图控制器列表。
答案 2 :(得分:0)
你应该在app delegate中声明一个NSString并使用app delegate变量传递值
答案 3 :(得分:0)
您可以为myTableView
变量创建一个属性,如下所示:
标题文件:
@property (nonatomic, retain) IBOutlet UITableView* myTableView;
实施档案:
@synthesize myTableView;
然后,您应该能够使用以下内容参考第二课中的myTableView
:
((MyViewController*)self.navigationController.parentViewController)).myTableView ...
编辑:我试图在评论中加入这个,但它已经很长了......
@Peylo:所以你父母有一天性交,他们在子宫内知道你。然后你出来了,你了解了他们。你的家人是一个循环的参考,没有什么不好的。
循环引用包含在编程中的所有位置。考虑一个ViewController
可以引用它View
然后可以引用它ViewController
,还可以引用它的Views
,它可以引用它们的父View
{{1}} 1}},但也无休止地提及他们的孩子等。这基本上就是委托是什么,一种对象引用一些其他(可能是未知的)对象的方式。我可以很容易地鼓励OP使用我已经想到的协议,但我更喜欢这个解决方案作为一种快速而肮脏的方法来实现所需的结果。
与pointed out numerous times in the past一样,您应首先使您的应用工作。如果代码没有执行正确的操作,那么“好”,“快”等等并不重要。
理论上,您应该花费大部分时间来构建应用程序,只需花费较少的时间来开发软件。在实践中,它几乎从不以这种方式工作。在专业的环境中,你必须能够为你的工作辩护,这有时意味着在生产力方面犯错,而不是“正确”的代码。
也许你来自一个完美的世界,在这个世界里,你总是能够完美地构建你的软件,永远不会得到一堆由斯托纳开发的垃圾代码,在这种情况下,我希望我们都能像你一样幸运。但truth still remains大多数软件在完成之前就被放弃了,或者超出预算或没有按时完成。