解雇ViewController:不工作

2024-02-11

我有一个名为 vc0 的视图控制器,其显示如下:

[self presentViewController: vc1 animated: YES completion: nil];

在 vc1 中,我有一个按钮来呈现另一个视图控制器:

[self presentViewController: vc2 animated: YES completion: nil];

然后在 vc2 中,我有一个按钮可以关闭视图控制器:

[self dismissViewControllerAnimated:YES completion: ^{
// over here I call one method in vc1
}

正如预期的那样,它返回到 vc1.. 但是 vc1 中有一个按钮可以通过关闭视图控制器返回到 vc0,如下所示:

    [self dismissViewControllerAnimated:YES completion:nil];

但由于某种原因它不起作用,视图控制器不会被退回到 vc0。当我第一次呈现 vc1 时,我可以按下按钮来关闭视图控制器,它就可以工作了。但是,当我按下按钮打开 vc2,并且当我将 vc2 关闭回到 vc1,然后按下按钮关闭视图控制器时,那就是它不起作用的时候。

抱歉,如果问题有点不清楚,我很难表达我想说的内容。

另外还有一件事:

我尝试更换dismissViewControllerAnimated:在 vc1 中手动显示 vc0,但随后我在控制台中收到一条日志,显示我正在尝试显示 vc0,但 vc1 的视图不在窗口层次结构中。这是什么意思?

感谢帮助!

UPDATE:

在这种情况下,VC0 是MenuMileIndexViewController- VC1 是FlightViewController- VC2 是BookmarksTableViewController

下面是涉及到的代码:

菜单里程索引视图控制器:

- (IBAction)goToOriginPage {

FlightRecorder *origin = [[FlightRecorder alloc] init];
[self presentViewController:origin animated:YES completion:nil];

}

飞行记录仪:

    - (void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar {

        [self bringUpBookmarkkTable];
}

- (void) bringUpBookmarkkTable {

    BookmarkTableViewController *bookmarkTVC = [[BookmarkTableViewController alloc] init];

    [bookmarkTVC setModalTransitionStyle: UIModalTransitionStyleFlipHorizontal];

    [self presentViewController:bookmarkTVC animated:YES completion:nil];
}

- (IBAction)cancel {

[self dismissViewControllerAnimated:YES completion:nil];

}

- (void)endBookmarkProcessWithBookmarkCollection: (NSDictionary *)dict {

    presetBookmarkContext = [dict mutableCopy];

    bookmarkMode = YES;

    NSString *compiledText = nil;

    NSNumber *number1 = [NSNumber numberWithInt: 1];

    if ([dict objectForKey: @"bookmarkTag"] == number1) {

        compiledText = [NSString stringWithFormat: @"%@ to %@", [dict objectForKey: @"origin"], [dict objectForKey: @"destination"]];
    }
    else {

        compiledText = [NSString stringWithFormat: @"%@ to %@", [dict objectForKey: @"destination"], [dict objectForKey: @"origin"]];
    }

    compiledText = [compiledText stringByReplacingOccurrencesOfString:@"Origin: " withString:@""];

    compiledText = [compiledText stringByReplacingOccurrencesOfString:@"Destination: " withString:@""];

    flightContext = [NSDictionary dictionaryWithObjectsAndKeys: [dict objectForKey: @"miles"], @"miles", compiledText, @"location", [[NSUserDefaults standardUserDefaults] objectForKey: @"tempD"], @"date", nil];

    NSString *string = [NSString stringWithFormat: @"\nMiles: %.2f\nFlight: %@\nDate: %@", [[dict objectForKey: @"miles"] floatValue], compiledText, [[NSUserDefaults standardUserDefaults] objectForKey:@"tempD"]];

    UIAlertView *bvkBookmarkAlertView = [[UIAlertView alloc] initWithTitle:@"Confirmation" message:string delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add", nil];

    [bvkBookmarkAlertView show];
}



 - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {

    if (buttonIndex == 1) {

        [self cancel]; // Even though cancel is an IBAction, IBAction is the same thing as void so it is callable
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

    if (buttonIndex == 1) {

        [TheMileIndexViewController addDesiredMilesToIndex: [[flightContext objectForKey: @"miles"] doubleValue]];

        [TravelLogViewController addFlight: flightContext];

        if (!bookmarkMode) {

            if ([checkbox isSelected]) {

                [BookmarkHandler uploadBookmark: bookmarkFlightContext];
            }    
        }
    }

    if (buttonIndex == 0) {

        if ([alertView.title isEqualToString: @"Confirmation"]) {

            bookmarkMode = NO;
        }
    }

}

书签TableViewController:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [tableView deselectRowAtIndexPath:indexPath animated: YES];

    NSDictionary *dict = [[BookmarkHandler bookmarkCollection] objectAtIndex: indexPath.row];

    fl = [[FlightRecorder alloc] init];

    [self dismissViewControllerAnimated:YES completion:^{

        [fl endBookmarkProcessWithBookmarkCollection: dict];
    }];
}

现在,我已经在模拟器中创建了应用程序的屏幕录制,显示了问题所在。我可以通过电子邮件将其发送给您以供参考。所以我可以通过电子邮件将其发送给您。


我建议始终使用委托从实际提出它的 VC 中解雇 VC。这实际上也是苹果推荐的方式 - 正如我之前对这个问题的回答中指出的那样。

因此,如果您有 VC0 呈现 VC1,则也可以使用委托方案在 VC0 中取消 VC1 代码。

我了解到这是处理呈现和消除的最安全方法 - 尽管有时可以在 VC1 本身内消除 VC1。

我问了一个非常相关的问题,你可能也有兴趣检查一下。它显示了code... https://stackoverflow.com/questions/11596200/opening-and-closing-other-uiviewcontrollers-any-other-approaches-than-to-use-p

ps 我还读到有些人只驳回 VC1 - 这反过来也会驳回 VC2。但是,如果我之前的建议有效,我就不会这样做。有时我在执行过程中得到信息(没有崩溃),VC 不再存在或与之相关的任何信息 - 所以我认为这不是最好的解决方案。但如果我的前一个建议不起作用,你可以尝试第二个。

虽然不能保证这会持续到新的 iOS 更新,但由于这个问题现在一直让我困扰于几个 iOS 更新:-),所以我决定采用标准推荐路线。

编辑: 这是我修改后的代码 - 它可以正常工作 - 但是不清楚用户响应警报后您打算发生什么以及警报是否应该在 VC1 或 VC0 上。无论如何,使用委托和回调我没有看到任何问题。请解释一下我是否错过了你的观点......

FlightViewControllerProtocol.h

@protocol FlightViewControllerProtocol <NSObject>
-(void) dismissVCAndEndBookmark;
@end

FlightViewController.m

#import "FlightViewController.h"
#import "FlightViewControllerProtocol.h"
#import "BookmarksTableViewController.h"
@interface FlightViewController ()

@end

@implementation FlightViewController
@synthesize delegate;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar {

    [self bringUpBookmarkkTable];
}

- (IBAction) bringUpBookmarkkTable {

    BookmarksTableViewController *bookmarkTVC = [[BookmarksTableViewController alloc] init];
    bookmarkTVC.delegate = self;
    [bookmarkTVC setModalTransitionStyle: UIModalTransitionStyleFlipHorizontal];

    [self presentViewController:bookmarkTVC animated:YES completion:nil];
}

- (IBAction)cancel {

    [self dismissViewControllerAnimated:YES completion:nil];

}

- (void)endBookmarkProcessWithBookmarkCollection: (NSDictionary *)dict {

//    presetBookmarkContext = [dict mutableCopy];

//    bookmarkMode = YES;

    NSString *compiledText = nil;

    NSNumber *number1 = [NSNumber numberWithInt: 1];

    if ([dict objectForKey: @"bookmarkTag"] == number1) {

        compiledText = @"Text1";
    }
    else {
        compiledText = @"Text2";
    }


//    flightContext = [NSDictionary dictionaryWithObjectsAndKeys: [dict objectForKey: @"miles"], @"miles", compiledText, @"location", [[NSUserDefaults standardUserDefaults] objectForKey: @"tempD"], @"date", nil];

    NSString *string = compiledText;

    UIAlertView *bvkBookmarkAlertView = [[UIAlertView alloc] initWithTitle:@"Confirmation" message:string delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add", nil];

    [bvkBookmarkAlertView show];
}


- (void) dismissVCAndEndBookmark {
    [self dismissViewControllerAnimated:YES completion:nil];
     [self endBookmarkProcessWithBookmarkCollection: nil];
}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {

    if (buttonIndex == 1) {

        [self cancel]; // Even though cancel is an IBAction, IBAction is the same thing as void so it is callable
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

    if (buttonIndex == 1) {

        NSLog(@"alertView1");
           }

    if (buttonIndex == 0) {
        NSLog(@"alertView2");

    }

}

@end

书签 TableViewController.h

 @interface BookmarksTableViewController : UIViewController
{
    id delegate;
}

@property (nonatomic,strong)   id delegate;

@end

书签 TableViewController.m

- (IBAction)goBack {
    [self.delegate dismissVCAndEndBookmark];
}

特别是,如果我正确理解您的意图,BookmarksTableViewController.m 中的回调似乎是您实现中的主要问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解雇ViewController:不工作 的相关文章

  • 通过 iOS 应用程序在 Twitter 上分享视频

    是否可以使用 SLRequest 分享视频 我可以使用相同的方式共享图像 SLRequest postRequest SLRequest requestForServiceType SLServiceTypeTwitter requestM
  • 如何在 swift 3 中将毫秒转换为日期字符串[重复]

    这个问题在这里已经有答案了 我正在尝试在 swift 3 中将毫秒转换为日期字符串 我尝试设置日期格式 但我没有获取当前日期字符串 var milliseconds 1477593000000 let date NSDate timeInt
  • UIScreen 屏幕始终返回 1 个屏幕

    我正在尝试在不使用镜像模式的情况下通过 Airplay 在 Apple TV 上显示图片 但当镜像关闭时 UIScreen Screens 方法始终返回 1 个屏幕 主屏幕 我希望我的图片显示与照片应用程序相同 Airplay 无需镜像 N
  • 如何快速使用 CoreLocation?

    我尝试过将 CoreLocation 与我的 Swift 应用程序一起使用 但没有运气 我有以下非常简单的代码 我已经链接了 CoreLocation 库 import UIKit import CoreLocation UIApplica
  • 前导点的自动完成功能无法快速工作

    当我尝试在 swift 中使用 前导点语法 时 我没有得到任何自动完成建议 是否没有实现此自动完成功能 或者是我的 Xcode 版本 6 3 1 有问题 例如 当我尝试这样的事情时 let col UIColor whiteColor 在我
  • 如何使财产成为财产

    我不太确定如何表达这个问题 所以我将举例说明 我想为房产做房产 我目前正在使用不同类别的属性 player Player alloc init player name PlayerName 这些属性在 Player 类中定义 并导入 Pla
  • 如何使用 NavigationStack 和 SwiftUI 发送额外数据?

    我有三个viewsA B 和 C 用户可以从 A 导航到 B 也可以从 A 导航到 C 用户可以从 B 导航到 C 现在我想区分用户是从 A 到 C 还是从 B 到 C 所以我在寻找如何在 NavigationStack 中传递额外的数据
  • iOS 9 的 UIAlertView 的替代方案?

    UAlertView在 iOS 9 及更高版本中已弃用 有什么替代方案吗 UIAlertView new UIAlertView alloc initWithTitle Success message Your InApp Purchase
  • 本地通知替代周重复

    我有两个通知 我想隔周重复一次 例如 在第一周的星期一设置一个通知 并应在第三周的星期一重复 第二次通知设置在第二周的星期二 并且应在第四周的星期二重复 为此我该怎么办 获取周数 并根据周数做出决定
  • iOS 的 WiFi 连接通知,包括 SSID

    新手 IOS 程序员正在寻找一种在 iPhone 连接到 WIFI 网络时收到通知的方法 IE 关于以下转换的通知 3G转WIFI WIFI转3G WIFI 到另一个 WIFI 它应该能够知道我连接到哪个 SSID 在 Android 上花
  • 来自 facebook 的高分辨率图像

    这就是我获取相册和相册中的图片的方式 let connectionPhotos FBSDKGraphRequestConnection let requestPhotos FBSDKGraphRequest graphPath String
  • 无法读取未定义的属性“messageHandlers”

    我想将 JavaScript 变量传递给 Swift 我在 JavaScript 中遇到错误并进行了搜索 但没有得到任何结果 错误是 类型错误 无法读取未定义的属性 messageHandlers 任何人都可以帮忙吗 我在 Xcode 中的
  • 我什么时候应该将可选值与 nil 进行比较?

    很多时候 您需要编写如下代码 if someOptional nil do something with the unwrapped someOptional e g someFunction someOptional 这似乎有点冗长 而且
  • 不担心“retainCount”吗?真的吗?

    有人告诉我不要担心保留计数 我明白我不应该决定release or retain使用基于条件逻辑retainCount 但我不应该担心吗 我认为这些在某种程度上与内存使用相对应 例如 如果我有一堆子视图UIView我也放入了NSArray能
  • UIBarButtonItem 和 UIGestureRecognizer

    我有一个UIView我在哪里添加了一个UITapGestureRecognizer UITapGestureRecognizer tapRecognizer UITapGestureRecognizer alloc initWithTarg
  • 为什么我无法更改 AU 多通道混音器输入范围中的元件/总线数量?

    UPDATE 我正在更改我的代码以更简化的方式说明问题 我还有一个小错误 虽然没有阻止问题的发生 但确实增加了一些混乱 我正在 iOS 中实例化多通道混音器 AU kAudioUnitSubType MultiChannelMixer 并执
  • 使用 addObserverForName:usingBlock 时删除观察者

    我有以下代码 在视图加载中添加观察者 void viewDidLoad super viewDidLoad NSNotificationCenter defaultCenter addObserverForName com app live
  • 另一个 - “无法识别的选择器发送到实例”问题

    我查看了有关该主题的每个已发布问题 但没有一个给我解决方案 我的项目在很大程度上复制了开发库中的 AVPlayer 演示应用程序 减去清理功能 我有一个复制和粘贴AVPlayerDemoPlaybackView类 重命名为YOPlaybac
  • 如何更改 Xcode 上的导航器字体大小

    有什么办法可以改变xcode中导航器面板的字体大小吗 我已设法使用 首选项 gt 字体和颜色 更改编辑窗口中的字体大小 但这不会更改导航器的字体大小 适用于 Xcode 12 及以上版本 Its default value is match
  • 如何使用 GPUImageHarrisCornerDetectionFilter 获取角点

    我正在尝试使用以下方法从静态图像中获取角点GPUImageHarrisCornerDetectionFilter 我查看了项目中的示例代码 查看了文档 还查看了这篇文章 内容大致相同 GPUImage 现有 UIImage 上的 Harri

随机推荐

  • 在 JavaFx 中重新启动应用程序

    我想关闭然后重新启动我正在制作的已经运行的应用程序 自动 通过单击按钮或类似的东西 我想这样做是为了以其他语言重新启动应用程序 我是对 JavaFx 和 Java 不太熟悉 请问您能给我解决这个问题吗 这个问题缺乏细节 您确实提到了 Jav
  • 使用 Spring Boot 设置 DynamoDB

    我正在尝试使用 SpringBoot 设置本地 DynamoDB 实例 我正在关注this https www baeldung com spring data dynamodb但使用 Gradle 当我尝试运行我的应用程序时 出现以下异常
  • 使用 LINQ 将项目推入堆栈

    我如何以编程方式将字符串数组推入通用堆栈 字符串数组 string array new string Liza Ana Sandra Diya 堆栈设置 public class stack
  • 获取 cp 无法创建常规文件 openssl 中没有这样的文件或目录

    尝试编译 openssl 代码时出现以下错误 在 make install 步骤中出现以下错误 如果有人解决了这个问题 请告诉我 谷歌搜索有链接 但指向一个未解决的问题 making install in crypto make 1 Ent
  • WCF 服务会公开属性吗?

    在实现 WCF 服务所需的接口中 我使用以下语句声明主类 ServiceContract 属性和任何公开的方法 OperationContract 我如何公开公共财产 谢谢 自从get属性的一部分是一种方法 这在技术上是可行的 但是 正如前
  • 如何通过外部 adb 命令判断 Android 活动是否已完成?

    在我们的测试中 我想使用脚本来运行一些 Android 活动 我可以使用 adb shell start Activity 命令来启动这些活动 有没有办法使用 adb 命令来判断活动何时完成 在发出下一个 adb start Activit
  • Weka 仅将数字更改为名义

    我有一个 CSV 文件 正在导入 Weka 所有变量均以数字形式导入 我需要将其中 3 个更改为名义值 然而 当我在其上放置数字滤波器时 所有变量都会发生变化 我只想改3 1 有没有办法通过过滤器改变一些 2 或者您可以在导入时设置它 如果
  • Android Studio 2.3 sdk 管理器选项卡呈灰色

    Android Studio 2 3 gt 配置 gt SDK 管理器 这些选项卡呈灰色 SDK 工具 SDK 更新站点 此外 显示包详细信息 复选框呈灰色 系统更新正常 没有错误消息 我认为这在 Studio 2 2 的某个时刻发生过 但
  • 编译项目时出错

    每次我尝试编译程序时都会收到此错误 一些项目功能 例如失败的完整解决方案分析 项目和依赖它的项目已被禁用 XamlCTask 任务不支持 DebugType 参数 验证任务中是否存在该参数 并且该参数是可设置的公共参数 实例属性 无法使用其
  • 如何在 fastapi 中使用刷新令牌?

    我试图找到一个使用的例子刷新令牌 https auth0 com blog refresh tokens what are they and when to use them 在 fastapi 中 快速APIdocs https fast
  • Java 8 lambda 语法中大括号何时是可选的?

    我意识到 Java 8 lambda 实现可能会发生变化 但在 lambda build b39 中 我发现只有当 lambda 表达式返回非 void 类型时才能省略大括号 例如 这样编译 public class Collections
  • MySQL Workbench 是否自动为外键创建索引?

    当我在 MySQL 工作台中创建外键时 索引 选项卡上会出现一个新条目 其与我刚刚创建的外键完全相同 这实际上是外键 由于某种原因显示在 索引 选项卡上吗 或者 MySQL Workbench 是否会尝试为我提供帮助并为我创建一个索引 知道
  • 在 DOM 元素上创建角度范围

    我需要创建一个新的角度范围并将其附加到 DOM 元素 我正在修改第三方控件 因此我无法选择仅使用指令 我需要做类似的事情 thirdPartyCallbackfunction domElement var myNewScope scope
  • segue完成后如何执行一些代码?

    iOS 6 是否可以知道何时UIStoryboardSegue已经完成转变了吗 就像我添加一个UIStoryboardSegue from UIButton推另一个UIViewController在导航控制器上 我想在推送转换完成后立即执行
  • 当没有文件要处理时,如何防止在SSIS包中导入Excel?

    我有一个导入 Excel 文件的 SSIS 包 在包内 我有一个脚本任务 用于在执行 Excel 导入过程之前检查 Excel 文件是否存在 当 Excel 文件不存在时 我无法执行包 因为AcquireConnection error 当
  • SQL Server 中的用户定义数据类型有多酷? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 SQL Server 中的用户定义数据类型是中级 SQL 用户应该了解和使用的吗 使用 UDT 的优点和缺点是什么 我的建议是永远不要使用它们
  • 为什么 RestKit 改变我的响应内容类型?

    简而言之 我尝试使用以下命令从服务器获取数据content typehttp请求头设置为 text html 但由于某种原因 RestKit 将其更改为application JSON 解释 如果我只使用AF网络 https github
  • 从领域数据库中获取单个列 (Android)

    我是领域的初学者 我有一个包含 3 列的表 其名称为ID 姓名 电子邮件 地址 为了获取 Name 列的数据 我们使用如下查询 从表名中选择名称 对于 SQLite 如果我们在Android中使用Realm 那么我们必须使用哪种方法来只获取
  • jinja2 如何删除尾随换行符

    我正在使用 jinja 2 输出 yaml 文件 但似乎无法摆脱尾随换行符和 for 循环的末尾 例如下面的 request path path headers origin somedomain com user agent agent
  • 解雇ViewController:不工作

    我有一个名为 vc0 的视图控制器 其显示如下 self presentViewController vc1 animated YES completion nil 在 vc1 中 我有一个按钮来呈现另一个视图控制器 self presen