【问题标题】:Objective-C: Automatically create Views/ViewController from data structureObjective-C:从数据结构中自动创建 Views/ViewController
【发布时间】:2017-11-04 18:34:15
【问题描述】:

我开始编写一个应用程序来显示以下数据结构:

  • 类别 #0
    • 子类别 #0.0
      • 项目#0.0.0
        • 物品描述
      • ...
      • 项目 #0.0.n
    • ...
    • 子类别 #0.n
  • ...
  • 类别#n

换句话说,有些类别带有子类别,而子类别又可能包含子类别,依此类推。最后的子类别包含一个项目列表,单击时应显示简短描述。

我正在考虑一个设计,就像 iPhone 上的原生 Settings 应用程序一样。一切都包含在导航控制器中,并显示第一个类别。单击时会出现一个新视图,其中显示子类别。这一直持续到单击项目并显示描述为止。

我想知道如何才能实现这一点。

  1. 什么是存储数据的可靠、可扩展的方式(如上)。我不想将数据硬核化为NSDictionaryNSDictionaryNSStringNSString。也许像 JSON 这样的东西,然后使用解析器,将数据写入NSDictionary?
  2. 所有的视图/视图控制器都具有相同的性质(可能除了显示描述的最终控制器)。它们显示类别列表并保存数据以创建 VC 更深一步。但是一个 VC 如何以编程方式创建另一个 VC 并显示它呢?我敢肯定有一种更优雅的方式。

【问题讨论】:

    标签: ios objective-c iphone uiviewcontroller nested


    【解决方案1】:

    您可以以任何您喜欢的格式存储数据,例如 XML 或 JSON 都可以,主要是考虑一个舒适的结构,例如 index = data。您可以将数据从前一个 VC 传递到下一个并跟踪其索引

    那么你可以如下使用它:

    带有导航控制器的根视图控制器

    #import "ViewController.h"
    #import "DetailViewController.h"
    
    @interface ViewController ()
    @property (strong, nonatomic) IBOutlet UIButton *navButton;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    - (IBAction)navigate:(UIButton *)sender
    {
        DetailViewController *vc = [DetailViewController new];
        vc.prevIndex = 0;
        vc.dataString = @"data";
        vc.view.backgroundColor = [UIColor whiteColor];
        [self.navigationController pushViewController:vc animated:YES];
    }
    
    @end
    

    DetailViewController - 用于显示子类别/项目

    DetailViewController.h

    @interface DetailViewController : UIViewController
    
    @property (nonatomic, assign) NSInteger prevIndex;
    @property (nonatomic, strong) NSString *dataString;
    
    @end
    

    DetailViewController.m

    #import "DetailViewController.h"
    
    @implementation DetailViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
    
        UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 100, 0, 0)];
        [button setTitle:[NSString stringWithFormat:@"navigate from %li", (long)_prevIndex] forState:UIControlStateNormal];
        [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(navigate) forControlEvents:UIControlEventTouchUpInside];
        [button sizeToFit];
        [self.view addSubview:button];
    }
    
    - (void)navigate
    {
        DetailViewController *vc = [DetailViewController new];
        vc.prevIndex = _prevIndex + 1;
        vc.dataString = [NSString stringWithFormat:@"data %li", (long)vc.prevIndex];
        vc.view.backgroundColor = [UIColor whiteColor];
        [self.navigationController pushViewController:vc animated:YES];
    }
    
    @end
    

    【讨论】:

      猜你喜欢
      • 2011-12-14
      • 2017-11-08
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多