Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在UIViewController中设置parentViewController?_Iphone_Cocoa Touch_Uiviewcontroller_Hierarchy_Parentviewcontroller - Fatal编程技术网

Iphone 如何在UIViewController中设置parentViewController?

Iphone 如何在UIViewController中设置parentViewController?,iphone,cocoa-touch,uiviewcontroller,hierarchy,parentviewcontroller,Iphone,Cocoa Touch,Uiviewcontroller,Hierarchy,Parentviewcontroller,UIViewController的parentViewController属性为只读,但我正在嵌套自定义视图控制器,并希望使用此属性 然而,由于它是只读的,并且我没有找到其他方法来设置这个属性,我的问题是:如何设置它 显然,UINavigationController可以在-pushViewController中设置属性,也可以在-presentModalViewController中设置属性,所以这是可能的 我知道我可以添加自己的UIViewController属性,但我确信原则上parent

UIViewController的parentViewController属性为只读,但我正在嵌套自定义视图控制器,并希望使用此属性

然而,由于它是只读的,并且我没有找到其他方法来设置这个属性,我的问题是:如何设置它

显然,UINavigationController可以在-pushViewController中设置属性,也可以在-presentModalViewController中设置属性,所以这是可能的

我知道我可以添加自己的UIViewController属性,但我确信原则上parentViewController是正确的属性。

但是,由于它是只读的,并且我没有找到其他方法来设置此属性,我的问题是:如何设置它

- (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属性。不知道为什么这不是公认的答案。