使用 unwind segues 通过 UITableViewcell 推送数据

Posted

技术标签:

【中文标题】使用 unwind segues 通过 UITableViewcell 推送数据【英文标题】:Pushing data through UITableViewcell with unwind segues 【发布时间】:2015-01-02 15:28:59 【问题描述】:

我有一个 push segue,用于将数据从 uitableview 单元格传输到文本字段。该应用程序计划是用户将数据输入到文本字段中,然后他们将单击一个按钮,它将模态转移到表格视图控制器,然后他们将选择一个 uitableviewcell 并将其传输回原始视图他们在文本字段中输入了数据,并且 tableviewcell 内容将输入到同一视图上的不同文本字段中。但是我遇到了从原始文本字段中删除数据并创建另一个视图的问题。

所以现在,我尝试使用展开转场,所以现在之前输入的数据正在显示,但表格视图单元格没有像以前那样填充。

这是推送数据的代码-

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    if ([segue.identifier isEqualToString:@"showRecipeDetail"]) 
        NSIndexPath *indexPath = nil;
        Recipe *recipe = nil;
        if (self.searchDisplayController.active) 
            indexPath = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow];
            recipe = [searchResults objectAtIndex:indexPath.row];
         else 
            indexPath = [self.tableView indexPathForSelectedRow];
            recipe = [recipes objectAtIndex:indexPath.row];
        


PersonDetailTVC *destViewController = segue.destinationViewController;
        destViewController.recipe = recipe;

        [self dismissViewControllerAnimated:YES completion:nil];
    

这是展开转场的代码 -

- (IBAction)unwindFromDetailViewController:(UIStoryboardSegue *)segue

    // ViewController *detailViewController = [segue sourceViewController];
    NSLog(@"%@", segue.identifier);

【问题讨论】:

与其在控制器之间创建依赖关系并尝试在它们之间传递数据,不如考虑创建一个单独的对象来代表您的应用程序的数据模型。当控制器想要更改某些内容时,请更新模型。当控制器需要显示某些内容时,请向模型询问其当前值。 好的,你知道我该如何开始吗? 【参考方案1】:

从 cmets 扩展,开始使用数据模型对象:

AppDataModel.h

#import <Foundation/Foundation.h>

@class Recipe;

@interface AppDataModel : NSObject

+ (instancetype)sharedData;

- (void)selectRecipeAt:(NSUInteger)index;

@property (nonatomic, strong, readonly) Recipe *selectedRecipe;

@end

AppDataModel.m

#import "AppDataModel.h"

@interface AppDataModel ()

@property (nonatomic, strong) NSArray *recipes;
@property (nonatomic, strong, readwrite) Recipe *selectedRecipe;

@end

@implementation AppDataModel

+ (instancetype)sharedData 
    static AppDataModel *dataModel = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
        dataModel = [[AppDataModel alloc] init];
    );
    return dataModel;


- (void)selectRecipeAt:(NSUInteger)index 
    self.selectedRecipe = [self.recipes objectAtIndex:index];


@end

用法:

[[AppDataModel sharedData] selectRecipeAt:0];
Recipe *toDisplay = [[AppDataModel sharedData] selectedRecipe];

这假设您在数据模型中也有代码来设置配方数组。

【讨论】:

它要求我添加“[”并且初始化元素不是编译时间常量 信息仍然只是创建另一个视图并删除旧的东西。我认为这与推回原始控制器有关。 如果您只将数据存储在模型中并在视图出现时从模型中更新,那么擦除显示的内容不再重要。 (我不知道您句子中的“信息”是什么意思。)但是,是的,您想放松,而不是创建重复的控制器。

以上是关于使用 unwind segues 通过 UITableViewcell 推送数据的主要内容,如果未能解决你的问题,请参考以下文章

无法通过情节提要创建 Unwind Segue Xcode 11

UINavigationController 的 Unwind Segue

从 Unwind segue 触发时,Push segue 不起作用

使用 unwind segues 推送数据

“Unwind Segue”可以在通过故事板参考连接的两个故事板之间工作吗?

为啥我的 unwind segue 回退太远了?