Iphone 如何在UIViewController中设置parentViewController?
UIViewController的parentViewController属性为只读,但我正在嵌套自定义视图控制器,并希望使用此属性 然而,由于它是只读的,并且我没有找到其他方法来设置这个属性,我的问题是:如何设置它 显然,UINavigationController可以在-pushViewController中设置属性,也可以在-presentModalViewController中设置属性,所以这是可能的 我知道我可以添加自己的UIViewController属性,但我确信原则上parentViewController是正确的属性。但是,由于它是只读的,并且我没有找到其他方法来设置此属性,我的问题是:如何设置它Iphone 如何在UIViewController中设置parentViewController?,iphone,cocoa-touch,uiviewcontroller,hierarchy,parentviewcontroller,Iphone,Cocoa Touch,Uiviewcontroller,Hierarchy,Parentviewcontroller,UIViewController的parentViewController属性为只读,但我正在嵌套自定义视图控制器,并希望使用此属性 然而,由于它是只读的,并且我没有找到其他方法来设置这个属性,我的问题是:如何设置它 显然,UINavigationController可以在-pushViewController中设置属性,也可以在-presentModalViewController中设置属性,所以这是可能的 我知道我可以添加自己的UIViewController属性,但我确信原则上parent
- (void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0);
如果它是只读的
,则不能使用点表示法而不获得一个字符
但是,您可以使用将自定义的modifyParentViewController
方法添加到UIViewController
类中
即使属性是只读的,变量本身也可能是可修改的,如果它不受
@保护的话。如果视图控制器受@保护
,子类化视图控制器可能允许您选择修改变量。parentViewController用于导航视图控制器和显示模态视图控制器,如果没有方法pushViewController或presentModalViewController,则无法设置属性。parentViewController是一个只读属性,只能由UIViewController类和UINavigationController类读取,这些类的子类将无权设置该属性。我尝试了Alex的建议,为UIViewController创建一个类别,它在模拟器中起作用,但在我的手机上不起作用。这是分类
@interface UIViewController (parentSetter)
-(void)setParentUIViewController:(UIViewController*)parent;
@end
@implementation UIViewController (parentSetter)
-(void)setParentUIViewController:(UIViewController*)parent
{
_parentViewController = parent;
}
@end
- (void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0);
它的编译和工作都很好,但请注意下划线成员有点令人讨厌。
这就是针对3.0 SDK编译时导致链接器错误的原因
我有一个容器视图,它有两个子视图,表就是其中之一。该表需要一个父表,以便它可以与导航栏交互
我将采用以下解决方案:
@interface AdoptedTableViewController : UITableViewController {
UIViewController* surrogateParent;
}
-(UINavigationController*)navigationController;
@property (nonatomic, assign) IBOutlet UIViewController *surrogateParent;
@end
@implementation AdoptedTableViewController
@synthesize surrogateParent;
-(UINavigationController*)navigationController
{
if( [super navigationController] )//self.navigationController )
{
return [super navigationController];
}
else
{
return surrogateParent.navigationController;
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
我的所有表视图控制器现在都采用TableViewController。他们需要父对象的主要原因是,他们可以将视图控制器推送到导航堆栈上,这样导航控制器getter就可以透明地处理视图控制器
如果parentViewController不是只读的,那就太好了,但是在我与_parentViewController的接触中,我发现ViewController层次结构不仅仅是该属性。我认为在这种关系中可能有很多耦合和责任,而苹果没有为大众清理足够的。例如,我在向上移动导航层次结构时注意到一个奇怪的取消选择行为,我无法修复它。也许UINavigation控制器反映了其顶级控制器的级别,并且表现不同
简而言之,它实际上是只读的,没有干净或简单的解决方法。您只需要构建它。它看起来像是调用setParentViewController:方法
[childViewController setParentViewController:self];
但是,这仍然会生成编译器警告。依我看,这意味着不要这样做(我改为子类)。解决方案是:
- (void)setParentController:(UIViewController*)parent{
[self setValue:parent forKey:@"_parentViewController"];
}
它不会导致链接器出现问题
PS:不要使用“setParentViewController”作为方法名,因为这个方法存在于私有API中,苹果公司说:
“应用程序中包含的非公共API为setParentViewController:
如果您在源代码中使用与上述API相同的名称定义了一个方法,我们建议更改您的方法名称,使其不再与Apple的私有API冲突,以避免您的应用程序在将来提交时被标记
请在下次更新中解决此问题……我知道此问题是在iOS 5之前提出的,但作为参考,您应该在嵌套UIViewController时使用addChildViewController。这也将自动设置parentViewController属性
- (void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0);
您可以在上阅读有关“创建自定义内容视图控制器”的更多信息。这样做对我来说有点太脏了,但我想如果我坚持使用parentViewController,这几乎是唯一可能的方法。
不过,我将使用自定义UIViewController属性。在父级上添加ChildViewController就是这样做的。我认为,在该线程中否决每个答案的人都可以给出理由:)不是我,但我怀疑他们不同意使用私有API,投票否决使用私有API的建议似乎是如此普遍。也许他们是苹果鼹鼠。这不会导致应用商店拒绝吗?这解决了我的一些模态表示问题,但很可怕。这对我来说是可行的,在子视图控制器上设置parentViewController属性。不知道为什么这不是公认的答案。