【问题标题】:Moving back from a Controller to a previous one从控制器移回前一个控制器
【发布时间】:2012-02-20 14:30:11
【问题描述】:

我正在尝试从我的 UIViewController 切换回我的 UITableViewController 但显然它没有按照我想要的方式工作。 我确实从一开始就使用故事板创建了我的界面,所以我并没有真正通过代码从一个视图移动到另一个视图。到目前为止,我只是按序列推送我的视图,这些视图很容易通过情节提要实现。但是当我尝试回到我以前的视图时,将实现一个新的 ViewController,所以我存储在旧视图中的所有数据都“丢失”了。

实际上我没有代码可以给你看(因为 sergues),但情况是:

->我的 UITableView 中有一个 MutableArray 存储内容。

->用户点击扫描按钮,扫描一个应该导入到我的数组中的新项目。

->当我试图推回我的 tableView 时,有一个新的控制器在等待我,不知道我存储在旧控制器中的数据。

那么,我该如何简单地移回旧控制器以防止一直创建新控制器?

sergue-push 是否总是创建一个新的 Controller?

(问题可能很简单,但我是新手。尝试了搜索功能提供的一些结果,但没有一个有效:()

/edit: 弹回问题已解决,但数组填充问题仍然存在。代码:

GeneralSettings *sharedGS = [GeneralSettings sharedInstance];
sharedGS.strEAN = [[NSString alloc] initWithString:strCheckString];
[sharedGS.listArray insertObject:strCheckString atIndex:0];
NSLog(@"Anzahl der EAN-Codes: %d\nErster Code: %@\n In Variable: %@", sharedGS.listArray.count, [sharedGS.listArray objectAtIndex:0],sharedGS.strEAN);

sharedGS.strEAN 中的数据(“83274572354”即) listArray 中的数据(空)

【问题讨论】:

    标签: objective-c xcode uiviewcontroller push storyboard


    【解决方案1】:

    你不会退缩。这会创建前一个控制器类的新实例。你弹回来。您可以通过 2 种方式实现。

    1:当您想要返回(弹出)到平板电脑视图控制器时,在代码中放入以下语句。

    [self.navigationController popViewControllerAnimated:YES];

    2:如果你想在 storyboard 中实现,你需要实现以下自定义 segue 类:

    实现

    //  PopSegue.m
    
    #import "PopSegue.h"
    
    @implementation PopSegue
    
    - (void) perform {
    
        UIViewController *src = (UIViewController *) self.sourceViewController;
    [src.navigationController popViewControllerAnimated:YES];
    }
    

    和标题

    //  PopSegue.h
    
    #import <UIKit/UIKit.h>
    
    @interface PopSegue : UIStoryboardSegue
    
    @end
    

    将此方法放在您的 UIViewController 中以将属性设置回您的 UITableViewController:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([[segue identifier] isEqualToString:@"goBackToTableView"])  {
        [[segue destinationViewController] set{whatEverProperyYouWantTo}: {valueOfPropertyToSet}];
        }
    }
    

    【讨论】:

    • 谢谢!我正在使用第一个,因为为单个弹回创建一个新类会有点过大。但是我的数组仍然没有按预期工作......我查找了我的变量并且我的数据在那里(例如“432436274”)但是当我尝试使用 addObject 或 insertObject:atIndex cmd 将它添加到我的数组时,有什么也没发生。你也可以帮我吗?
    • 代码看起来像:'GeneralSettings *sharedGS = [GeneralSettings sharedInstance]; sharedGS.strEAN = [[NSString alloc] initWithString:strCheckString]; [sharedGS.listArray insertObject:strCheckString atIndex:0]; NSLog(@"Anzahl der EAN-Codes: %d\nErster Code: %@\n In Variable: %@", sharedGS.listArray.count, [sharedGS.listArray objectAtIndex:0],sharedGS.strEAN);'代码格式化不起作用还是我做错了? “我的代码”?
    • 您可以设置委托和委托协议,但更简单的方法是使用第二个选项。第二种方法很简单——只需将我的代码复制到一个新的objective-c 类中。然后在 UIViewController 中实现一个 prepareForSegue 方法并在目标视图控制器(您的 UITableViewController)上设置一个属性。我将在上面的可能答案中发布 prepareForSegue 方法。
    【解决方案2】:

    @T.J 采用这种方法时 "2:如果你想在故事板中做,你需要实现以下自定义 segue 类:

    实施”

    并根据以下the document, “在触发 Segue 时配置目标控制器 触发 segue 时,iOS 会执行以下任务:

    它实例化目标视图控制器。 它实例化一个新的 segue 对象,该对象包含被触发的 segue 的所有信息。 注意:popover segue 还提供了一个属性,用于标识用于控制目标视图控制器的 popover 控制器。 它调用源视图控制器的 prepareForSegue:sender: 方法,传入新的 segue 对象和触发 segue 的对象。 它调用 segue 的 perform 方法将目标控制器带到屏幕上。实际行为取决于正在执行的 segue 类型。例如,模态 segue 告诉源视图控制器呈现目标视图控制器。 它释放了segue对象,segue就完成了。”

    它再次实例化呈现的 viewController,然后在调用“perform”的覆盖方法之后解除分配。所以最好根据the document选择你提交的第一个方法或者委托的方法。

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 2022-01-18
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      相关资源
      最近更新 更多