Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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
如何手动设置";“后退”;iOS应用程序中的目标_Ios_Objective C_Segue_Uinavigationitem_Uivewcontroller - Fatal编程技术网

如何手动设置";“后退”;iOS应用程序中的目标

如何手动设置";“后退”;iOS应用程序中的目标,ios,objective-c,segue,uinavigationitem,uivewcontroller,Ios,Objective C,Segue,Uinavigationitem,Uivewcontroller,我有一个名为“detailViewController”的UIViewController 该视图控制器通过多个不同的段使用推送段进行访问 我面临的问题是,detailViewController上的“后退”按钮会将用户带回上一个视图控制器(应该是这样),但是我希望“后退”按钮会将用户带回masterViewController(应用程序中的默认UIViewController) 我该怎么做 我尝试过改变segue的类型,但是那根本没用 Peter使用以下代码返回主视图控制器: [self.na

我有一个名为“detailViewController”的UIViewController

该视图控制器通过多个不同的段使用推送段进行访问

我面临的问题是,detailViewController上的“后退”按钮会将用户带回上一个视图控制器(应该是这样),但是我希望“后退”按钮会将用户带回masterViewController(应用程序中的默认UIViewController)

我该怎么做

我尝试过改变segue的类型,但是那根本没用


Peter

使用以下代码返回主视图控制器:

[self.navigationController popViewControllerAnimated:YES];
-(void) popToViewController:(NSString *)controllerName withNavController:(UINavigationController *)navController
{
    // STStatistics refers a singleton class of common functions.
    NSArray *mArr = [STStatistics navigateToViewController:controllerName withControllers:navController.viewControllers];  

    navController.viewControllers = mArr;

    // There should be more than one controller in stack to pop.
    if([mArr count] > 1)
    {
        [navController popViewControllerAnimated:YES];
    }
}
编辑:
根据这些评论,我意识到我的代码只让您后退一步,可能无法回答这个问题中的问题。谢谢。

您正在寻找的方法是UINavigationController的
poptrootviewcontrolleranimated:

从“弹出堆栈上除根视图控制器之外的所有视图控制器并更新显示。”

您需要创建一个自定义的后退按钮。您无法覆盖后退按钮的功能

比如:

UIButton *myBackButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myBackButton addTarget:self action:@selector(popToRoot:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *myCustomBackButtonItem = [[UIBarButtonItem alloc] initWithCustomView:myBackButton];
[self.navigationItem setLeftBarButtonItem:myCustomBackButtonItem];
PoptRoot:的实现如下所示:

- (void)popToRoot:(id)sender
{
    [self.navigationController popToRootViewControllerAnimated:YES];
}

如果您正在谈论的
masterViewController
是您可以调用的根目录:

[self.navigationController popToRootViewControllerAnimated:YES];

您可以自己创建后退按钮并调用
[self.navigationController popToRootViewControllerAnimated:YES]
。但是,这确实需要您自己创建后退按钮。另一种选择是使用当前视图控制器,并删除除第一个和当前控制器之外的所有视图控制器:

NSMutableArray *viewControllers = [self.navigationController.viewControllers mutableCopy];
[viewControllers removeObjectsInRange:NSRangeMake(1, [viewControllers count] - 2)];
self.navigationController.viewControllers = viewControllers;

我提出了一种解决方法,可以在导航控制器的集合中查找,并使用目标控制器的名称查找现有控制器和目标控制器之间的偏移量,然后删除中间控制器。不确定是否符合您的需要,但请尝试一下:

- (NSArray *)navigateToViewController:(NSString *)destinationControllerName withControllers:(NSArray *)sourceControllers
{
    NSMutableArray *controllers = [[NSMutableArray alloc] initWithArray:sourceControllers];

    NSInteger sourceControllerIndex = [controllers count] - 1;  // Value should be index oriented instead of position oriented.
    NSInteger destControllerIndex = 0;

    // Find position of destination controller  (index oriented)
    for (UIViewController *controller in controllers)
    {
        NSString *controllerName = NSStringFromClass([controller class]);
        NSLog(@"class name: %@", controllerName);

        if([[controllerName lowercaseString] isEqualToString:[destinationControllerName lowercaseString]])
            break;

        destControllerIndex +=1;
    }

    // If desired controller does not exists in the stack, do not proceed.
    if (destControllerIndex == sourceControllerIndex)
    {
        return controllers;
    }
    // If destination is the same as source do not enter in this block
    // If destination and source controllers have zero or no controllers in between do not enter in this block
    // If destination and source controllers has few controllers (at least one) in between, go inside this block.
    // Here "destControllerIndex + 1" shows, there is at least one controller in between source and destination.
    else if(destControllerIndex + 1 < sourceControllerIndex)
    {
        NSLog(@"controllers in stack: %@", controllers);

        // Start from the controller following the source controller in stack and remove it
        // till the destination controller arrives
        for (NSInteger iterator = sourceControllerIndex - 1; iterator > destControllerIndex; iterator--)
        {
            UIViewController *cont = [controllers objectAtIndex:iterator];
            if(cont) {
            [cont release]; cont = nil; }
            [controllers removeObjectAtIndex:iterator];
            NSLog(@"controllers in stack: %@", controllers);
        }
    }

    return controllers;
}
这就是所谓的:

[self popToViewController:@"NameOfDestinationControllerInNavStack" withControllers:self.navigationController];

实际上,这只是在导航堆栈中后退一步。。。可能尝试[self.navigationController PoptorootViewController激活:否];让我知道你为什么否决我的答案。如果你有一个导航控制器,它就可以工作。它们都不工作。第一个建议刚刚更新了导航栏。您建议将其更新为原来的详细信息loaded@Mushin,如果用户将4个视图控制器推到导航控制器上,该怎么办?这只会使它们返回一次,而不会返回到根目录。如果您不想返回到导航控制器的根目录,请澄清您的问题。不清楚你在问什么。例如,与您的
detailViewController
相关的
masterViewController
是什么?您的代码中有错误,我不确定将部分代码放在何处?如果启用arc编译,您可能会收到非arc错误。删除所有具有
release
调用的线路。制作一个“BaseViewController:UIViewController”,并继承所有UIViewController,如下所示:
detailViewController:BaseViewController
将前两个代码段放在base中,并将第三个代码段写在
detailViewController
中。我在尝试代码时遇到两个错误:未声明的选择器Popurute和不可见的@interface“UIButton”声明选择器“addTarget:selector:forControlEvent:”谢谢。我是徒劳的。现在修好了。由您来实现PoptRoot:。我将包括示例实现。太好了,我将试一试:)最后一个问题,如何设置按钮上的文本?现在它完全为空?您需要UIButton的setTitle:forState:。