草庐IT

iphone - prepareForSegue 和 popViewController 兼容性

coder 2024-01-14 原文

问题

我正在开发一个 iOS 应用程序,我有 3 个连续的 ViewControllers:

TableViewController --> DetailViewController --> ImageViewController

我用一个按钮执行 de forward Segue(只需在 Storyboard 上控制拖动)然后返回我有一个自定义后退按钮

[self.navigationController popViewControllerAnimated:YES];

为了转发数据,我使用

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    [segue.destinationViewController someFunction];
}

要向父级 ViewController 发送数据,我可以在 DetailViewController 中使用 prepareForSegue,但它在 中不起作用ImageViewController 并且我必须使用 Notifications

如果我使用 prepareForSeguepopViewControllerAnimated 发送数据可以吗?

我应该在这两种情况下都使用通知吗?

一些代码

我在 DetailViewController 中有一个按钮,它执行到 ImageViewController 的 Segue(只需控制 Storyboard 上的拖动)和一个后退按钮:

- (IBAction)backAction:(id)sender {
     [self.navigationController popViewControllerAnimated:YES];
}

然后是函数:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"forwardSegue"]) {
        [segue.destinationViewController someFuntionToImageViewController];
    } else {
        [segue.destinationViewController someFuntionToParentViewController];
    }
}

我注意到我无法将 segue.identifier 分配给 popViewController 操作。

最佳答案

Apple 推荐以下方式在由 segues 导航的 View Controller 之间传递数据:

向前传递数据:

您在目标 vc 上声明一个属性并在 prepareForSegue 方法中设置它的值。 (你就是这样做的)

@interface SomeViewController

@property (strong, nonatomic) VeryImportantData *data;
//...
@end

@implementation SourceVC

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    VeryImportantData *theData = ...;
    segue.destinationViewController.data = theData;
}

传回数据

您声明一个委托(delegate)协议(protocol)。这可能看起来像这样:

@protocol SomeViewControllerDelegate
- (void)someViewController:(SomeViewController *) someVC didFinishWithData:(SomeData *) data;
@end

您的目标 vc 提供了一个委托(delegate)属性:

@property (weak, nonatomic) id<SomeViewControllerDelegate> delegate;

一旦准备好关闭,目标 vc 将调用它的委托(delegate)方法:

@implementation SomeViewController

- (void) close
{
    [delegate someViewController:self didFinishWithData:self.data];
}

并且您的源 Controller 实现协议(protocol)并在 prepareForSegue 方法中将自己设置为目标 vc 的委托(delegate)。

@implementation SourceVC

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    segue.destinationViewController.delegate = self;
}


//...
- (void)someViewController:(SomeViewController *) someVC didFinishWithData:(SomeData *) data
{
    self.receivedData = data;
    [self.navigationController popViewControllerAnimated:YES];
}

关于iphone - prepareForSegue 和 popViewController 兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13110123/

有关iphone - prepareForSegue 和 popViewController 兼容性的更多相关文章

  1. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  2. ruby-on-rails - 不兼容的库版本 : nokogiri. bundle 需要 8.0.0 或更高版本,但 libiconv.2.dylib 提供 7.0.0 版本 - 2

    为了在我的mac上为一个rails项目安装mysql,我遵循了安装Homebrew软件和删除mac端口的在线建议。这是问题开始的地方。rails项目不会构建,我得到这个:[rake--prereqs]rakeaborted!dlopen(/Users/Parker/.rvm/gems/ruby-1.9.3-p448/gems/nokogiri-1.6.0/lib/nokogiri/nokogiri.bundle,9):Librarynotloaded:/opt/local/lib/libiconv.2.dylibReferencedfrom:/Users/Parker/.rvm/gem

  3. ruby - 用于 CSS3 跨浏览器兼容性的 SASS 插件? - 2

    是否有一个SASS扩展可以采用SASS样式表,找到中性属性(例如border-radius)并为其输出所有特定于供应商的属性(例如-webkit-border-radius等)自动?我真的不想手动创建所有混入,也不想手动编写代码。我确定一定有这样的扩展名,但我找不到它。帮忙? 最佳答案 有一个非常好的gem可以满足您的需求。它叫做Bourbon它不会用特定于供应商的css替换您的css,因为它可以像SASS一样工作。它基本上是一个正确生成跨浏览器css的mixin集合。 关于ruby-用

  4. ruby - 我在哪里可以找到与其兼容的 Ruby 版本的 gems 版本号? - 2

    这个问题说明了一切。例如,我有一台安装了ruby​​1.8.6的服务器。当我尝试sudogeminstallroo时,它给出了错误nokogirirequiresRubyversion>=1.8.7。所以,我想安装与Ruby1.8.6兼容的旧版本roo。但我不知道去哪里搜索。我知道RubyForge,但它也没有说明Ruby的兼容版本。 最佳答案 蛮力方法是获取一个git克隆,搜索它指定的Ruby版本的位置,然后使用gitblame甚至gitpickaxe来确定最后一个没有的版本'没有那个要求。

  5. ruby - Jekyll 与 .erb 的兼容性 - 2

    据我了解,Jekyll兼容Liquid和YAML。但是,是否有插件或可用功能可以使其与.erb(嵌入式Ruby)文件兼容?否则,这是一个不必要的功能还是没有用的东西?Jekyll对Liquid和YAML的内置使用是否会取代.erb将会或可以做什么?谢谢! 最佳答案 使用.erb不适合jekyll,但是你应该使用jekyll-renderinggem。 关于ruby-Jekyll与.erb的兼容性,我们在StackOverflow上找到一个类似的问题: http

  6. ruby - ruby 命令行开关 -rubygems & -r 不兼容吗? - 2

    我最近将一个ruby​​库转换为一个gem,这似乎破坏了命令行的可用性作为图书馆工作得很好$ruby-rfoobar-e'pFooBar.question'#=>"answer"作为一个gem,irb知道如何从命令行开关中请求一个gem$irb-rubygems-rfoobarirb(main):001:0>FooBar.question#=>"answer"但对于ruby​​本身来说同样失败了:$ruby-rubygems-rfoobar-e'pFooBar.question'ruby:nosuchfiletoload--foobar(LoadError)我现在必须这样做吗,这看起来

  7. Ruby 不兼容的字符编码 - 2

    我目前正在尝试编写一个脚本来遍历输入文件并检查网站上的数据。如果它找到新数据,它会打印到它通过的终端,如果没有,它会告诉我它失败了。反之亦然删除的数据。它工作正常,直到我收到的输入文件包含“™”字符。然后当ruby​​到达该行时,它会吐出一个错误:PDAPWeb.rb:73:in`include?':incompatiblecharacterencodings:UTF-8andIBM437(Encoding::CompatibilityError)违规行是一个简单的检查,以查看该文本是否存在于页面上。ifbrowser.text.include?(program_name)其中prog

  8. ruby - 不兼容的 marshal 文件格式(无法读取)需要格式版本 4.8; 0.0 给出 - 2

    我收到以下错误:incompatiblemarshalfileformat(can'tberead)formatversion4.8required;0.0given在这一行:从我的布局文件的这一部分:true%>true%>我以前从来没有遇到过这个问题,网上的解释对我来说太高级了,或者与制作游戏的人有关,我的项目是一个简单的rails应用程序,我昨天才开始。 最佳答案 您尝试过清算Assets吗?bundleexecrakeassets:clean然后重新编译:bundleexecrakeassets:precompile您是否以

  9. ruby 1.9 + sinatra 不兼容的字符编码 : ASCII-8BIT and UTF-8 - 2

    我正在尝试将sinatra应用程序迁移到ruby​​1.9我正在使用sinatra1.0、rack1.2.0和erb模板当我启动sinatra时它可以工作,但是当我从浏览器请求网页时出现此错误:Encoding::CompatibilityErrorat/incompatiblecharacterencodings:ASCII-8BITandUTF-8所有.rb文件都有这个标题:#!/usr/bin/envruby#encoding:utf-8我认为问题出在erb文件中,即使它显示它是UTF-8编码[user@localhostviews]$filehome.erbhome.erb:U

  10. vue3.0 + vite2.0+如何兼容低版本浏览器 - 2

    这里写自定义目录标题一、问题二、解决三、解决方案四、打包预览一、问题在使用vue3.2和vite2开发一个移动端或者钉钉端H5微服务iosapp内置浏览器打开没问题安卓app内置浏览器打开空白页面vconsole打印出现报错globalthisundefind二、解决内置浏览器版本比较低打印出来是63vue3代码不兼容低版本浏览器三、解决方案步骤一:vite.config.ts里build.target配置项指定构建目标为es2015或者步骤二:安装@vitejs/plugin-legacy安装完报错也还在指定版本可以解决“@vitejs/plugin-legacy”:“1.8.0”,步骤三:

随机推荐