iOS如何在已堆叠的ViewController上调用presentViewController
我正在尝试将视图控制器推到已经推过的视图控制器上,如下所示。然而,不知何故,当我试图推送iOS如何在已堆叠的ViewController上调用presentViewController,ios,presentmodalviewcontroller,Ios,Presentmodalviewcontroller,我正在尝试将视图控制器推到已经推过的视图控制器上,如下所示。然而,不知何故,当我试图推送newPersonViewController时,这个新控制器没有被推送到堆栈上。我不知道为什么Xcode抱怨我试图添加一个不属于层次结构的新控制器。我是否错误地显示了ABPeoplePickerViewController?这就是为什么不能将newPersonViewController推送到堆栈上的原因吗 来自控制台的消息: 警告:尝试显示其视图不在窗口层次结构中的对象 守则: - (void)addPe
newPersonViewController
时,这个新控制器没有被推送到堆栈上。我不知道为什么Xcode抱怨我试图添加一个不属于层次结构的新控制器。我是否错误地显示了ABPeoplePickerViewController
?这就是为什么不能将newPersonViewController
推送到堆栈上的原因吗
来自控制台的消息:
警告:尝试显示其视图不在窗口层次结构中的对象
守则:
- (void)addPerson
{
ABNewPersonViewController *newPersonVC = [[ABNewPersonViewController alloc] init];
newPersonVC.newPersonViewDelegate = self;
UINavigationController *uiNav = [[UINavigationController alloc] initWithRootViewController:newPersonVC];
[self presentViewController:uiNav animated:YES completion:nil];
}
- (void)showPeoplePicker
{
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.peoplePickerDelegate = self;
[self presentViewController:picker animated:YES completion:nil];
[picker.topViewController setEditing:YES];
picker.topViewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addPerson)];
picker.topViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(peoplePickerCancel)];
}
问题是,
addPerson
试图从视图控制器(而不是当前控制器)以模态方式呈现。self
(原始视图控制器)不是活动控制器。ABPeoplePickerNavigationController
因此,首先,定义一个类属性来跟踪选择器
:
@property (nonatomic, weak) ABPeoplePickerNavigationController *picker;
然后呢,
- 修改
以设置该属性;及showPeoplePicker
- 修改
以使用该属性:addPerson
问题的根源在于
addPerson
中存在[self-presentViewController:…]
,因为self
不是当前的视图控制器。只需将其更改为新属性,您就完成了!抱歉用编辑折磨你!嗨,罗布,非常感谢你!它正在工作。我也在考虑选择错误的活动视图控制器,但不知道如何修复它。之前我尝试过:[self.presentingViewController presentViewController:uiNav动画:是完成:nil]代码>和[self.presentingViewController.navigationViewController presentViewController:uiNav动画:是完成:无]代码>也是,但它不起作用。因此,我认为调用self.presentingViewController将为我提供当前显示的视图控制器。
- (void)addPerson
{
ABNewPersonViewController *newPersonVC = [[ABNewPersonViewController alloc] init];
newPersonVC.newPersonViewDelegate = self;
UINavigationController *uiNav = [[UINavigationController alloc] initWithRootViewController:newPersonVC];
[self.picker presentViewController:uiNav animated:YES completion:nil];
}
- (void)showPeoplePicker
{
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.peoplePickerDelegate = self;
[self presentViewController:picker animated:YES completion:nil];
[picker.topViewController setEditing:YES];
picker.topViewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addPerson)];
picker.topViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(peoplePickerCancel)];
self.picker = picker;
}
- (void)newPersonViewController:(ABNewPersonViewController *)newPersonView didCompleteWithNewPerson:(ABRecordRef)person
{
[newPersonView dismissViewControllerAnimated:YES completion:nil];
}