ios - 重用 Storyboard View Controller

标签 ios objective-c uitableview storyboard

我正在重建一个需要显示项目列表的应用程序。此列表使用 API 检索或从 Core Data 检索并显示在 UITableViewController 中。我遇到的问题是已经有七个不同的列表,其中差异很小。它们中的大多数只是不同的项目,但也包括一个列表中的搜索栏,并且之前声明的一个列表不会使用 API 加载,而是从 Core Data 加载。

在我的 Storyboard 中,我添加了一个 UITableViewController,其类 ItemsTableViewController 具有设计好的 UITableViewCell。我已经为这个单元格添加了一个标识符,所以我可以在这个 View Controller 中重用它。从主屏幕到此 View Controller 有一个 segue。

我们的想法是创建一个父对象 (ItemsTableViewController) 并添加多个子对象(SavedItemsTableViewController、LocalItemsTableViewController 等),它们都将使用父对象的共享逻辑,只有一些小的更改(API 和一些自定义内容)。

我目前的工作正常,但没有子对象:

- (void)offlineButtonPressed {
    [self performSegueWithIdentifier:@"openItemsTableViewController" sender:@(ItemListOffline)];
    //[[self navigationController] pushViewController:[[OfflineItemsTableViewController alloc] init] animated:YES];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"openItemsTableViewController"]) {
        switch((ItemList)[sender unsignedIntegerValue]) {
            case ItemListOffline: { [(ItemsTableViewController *)[segue destinationViewController] retrieveOfflineDocuments]; break; }
            case ItemListSearch: {
                [(ItemsTableViewController *)[segue destinationViewController] retrieveDocumentsWithQuery:@""];
                [(ItemsTableViewController *)[segue destinationViewController] addSearchBar];
                break;
            }
            // Loop through all the list...
            default: { NSAssert(NO, @"Unhandled type of document list."); break; }
        }
    }
}

所以应用程序只是调用处理请求的父对象的一个​​函数。但正如您可能感觉到的那样,该对象的可维护性会降低。在评论中,我推送了 subview Controller ,但由于它不包含 Storyboard View ,我需要从头开始重新创建单元格,这感觉不太好。此外,由于重用标识符,它无法正常工作,因为它无法使具有在 tableView:cellForRowAtIndexPath: 方法中设置的标识符的单元格出队。

现在我想知道最好的做法是什么?似乎我不能将 Storyboard中的保存 UITableViewController 用于多个子类,可以吗?但是在 Storyboard 中创建七个(将来可能会更多) Controller ,我需要将单元复制到每个 Controller 并只给它们不同的类,这似乎不是可行的方法。并向父级添加一个方法,在该父级中将以不同方式检索列表并更改一些内容(例如添加搜索栏),但也不是看起来最好的方式。

更新:ItemsTableViewController 中的逻辑非常简单。在委托(delegate)和数据源中,我处理的文档几乎相同。按列表类型检索的方法类似于:

- (void)retrieveOfflineItems {
    [self startLoading];

    [[APIManager instance] getOfflineItems:^(NSArray<ItemList *> *list, NSError *error) {
        [self setDocuments:list];
        [[self tableView] reloadData];
    }];
}

但是还有更多的东西,比如搜索必须添加一个搜索栏(一旦加载了 View )。所以在执行segue的时候需要调用多个方法。

最佳答案

您可以拥有一个 UITableViewController,其中包括所有 您可能的表格单元格,并且作为 prepareForSegue 调用的一部分,您应该为 Controller 和数据设置类型标识符 - 无论数据来自何处。

UITableViewController 类中,您可以隐藏/显示此数据类型所需的功能 - 例如搜索栏,并在 tableView 方法中,选择您需要的数据源。

这样,您需要维护的一个 UITableViewController 类比一个专用类稍微复杂一点,但比 7 个或更多类更易于维护!

假设您已经设置了一个变量 dataType 来标识您需要的数据类型,您可以为 numberOfRowsInSection 设置类似的内容,然后为其他 tableView 方法设置类似的内容

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    switch self.dataType {
    case dataType.MyFirstDataType:
        return myFirstDataTypeArray.count

    case dataType.MySecondDataType:
        return mySecondDataTypeArray.count

    case dataType.TheCoreDataType:
        return myCoreDataArray.count

    default:
        break
    }
}

关于ios - 重用 Storyboard View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41758769/

相关文章:

ios - 使用自定义类以编程方式创建 UIButton

ios - 保留嵌套 collectionView 的滚动位置

ios - 如何从主类访问自定义 Collection View 单元格类中的 TextView

objective-c - 适合 NSDictionary 的键

iphone - 以特定方法访问NSManagedObjects时,应用程序崩溃

ios - 来自轻弹 Action 和 UIPanGestureRecognizer 的意外结果

ios - UITableView 动态单元格高度仅在根据 uiimage View 调整单元格大小时滚动后才正确

ios - UIScrollView/UITableView 分层效果如Path

java - 适用于 iOS 的小数格式

objective-c - 如何根据他们选择的上一个 View 中的哪个单元格自定义用户看到的 UITableView?