gpt4 book ai didi

iphone - 像 Cocoa 一样抽象 UIViewController

转载 作者:可可西里 更新时间:2023-11-01 05:41:25 24 4
gpt4 key购买 nike

<分区>

编辑:是否有人提供有关此主题的一些有用链接?我的意思是编写可重用代码和“抽象”的良好实践?

tl;dr - 阅读此评论 Abstracting UIViewController like Cocoa ones

我有 3 个 UITableViewController:

  • CategoriesViewController
  • RecipesViewController
  • IngredientsViewController

它们是按层次排列的。以下是层次结构的示例:

  • 甜点(类别)
    • 布朗尼(食谱)
      • 牛奶(配料)
      • 巧克力(成分)
      • 黄油(配料)

enter image description here

其中每一个都具有与其他类似的功能。例如它们都有排序(移动行)、删除、添加(呈现模态视图)等。

目前,我已经为每个 View Controller 重复了所有代码,自定义了与每个 View Controller 相关的部分。例如它们都有一个像这样的实例变量:

CategoriesViewController.m:

@implementation CategoriesViewController {
NSMutableArray *categories;
}

RecipesViewController.m:

@implementation RecipesViewController {
NSMutableArray *recipes;
}

IngredientsViewController.m:

@implementation IngredientsViewController {
NSMutableArray *ingredients;
}

因为我认为有更好的方法来组织这个 View Controller ,所以我尝试创建一个 MyListViewController.h 的框架:

@interface MyListViewController : UITableViewController

@property (nonatomic, strong) NSMutableArray *list;

@end

MyListViewController.m:

@implementation MyListViewController

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [_list count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"ListCell"];

id currentObject = [_list objectAtIndex:indexPath.row];
cell.textLabel.text = [currentObject valueForKey:@"name"];

return cell;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
// get item to delete
id object = [_list objectAtIndex:indexPath.row];

// remove it from list
[_list removeObjectAtIndex:indexPath.row];

// call callback
[self didFinishDeletingItem:object];

// delete row from tableview
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
}

- (void)didFinishDeletingItem:(id)item
{
}

这样,一旦我对其进行子类化,我只需将 list ivar 分配给我的数据结构。我什至可以覆盖像 didFinishDeletingItem: 这样的方法来自定义每个 Controller 的行为。

因为这是我第一次使用以这种方式编写和组织代码的最佳实践,所以我很想知道您的意见以及哪些是抽象类以正确重用它们的最佳方法DRY 原则。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com