iOs:在这个简单的表视图应用程序中设置Model对象的正确方法是什么?

时间:2014-02-15 00:40:40

标签: ios iphone objective-c uitableview

不想告诉你我花了多少时间来解决这个看似简单的任务。 完成iOs Big Nerd Ranch指南后,我决定创建一个简单的应用程序来加强我对UITalbeViews的了解。

以下是应用结构: 在应用程序中有两个视图控制器。 主视图控制器是一个UITableView,每个单元格中都有一组编号的问题。 每个表格单元都有一个附件类型“详细信息披露按钮”。 单击该单元格可显示第二个View Controller的视图。在该视图中,该问题(标签)有简单的注释(细节)。 我的问题是,设置Model对象的正确方法是什么,以便问题将按连续顺序列出,点击它们将显示正确注释。 那时应该设置一系列有问题的问题? 如何设置这样的数组,以便后者何时可以按顺序排列所有问题?

这是我的代码。 Model对象Question.h:

    #import <Foundation/Foundation.h>

    @interface Question : NSObject

   @property (nonatomic, copy) NSString * question; @property
   (nonatomic, copy) NSString * details;

   +(id)createQuestion;    
   -(id)initWithQuestion:(NSString*)question details:(NSString*)details;  

   @end

问题:

#import "Question.h"

@implementation Question
@synthesize question, details;

+(id)createQuestion
{
        NSArray *arrayOfQuestions = [NSArray arrayWithObjects:
                                     @"1. Question 1",
                                     @"2. Question 2",
                                     @"3. Question 3",
                                     @"4. Question 4",
                                     @"5. Question 5",
                                     @"6. Question 6",
                                     @"7. Question 7",
                                     @"8. Question 8", nil];

        NSArray *arrayOfDetails = [NSArray arrayWithObjects:
                                   @"Comment 1",
                                   @"Comment 2",
                                   @"Comment 3",
                                   @"Comment 4",
                                   @"Comment 5",
                                   @"Comment 6",
                                   @"Comment 8",
                                   @"Comment 9", nil];

        // this is the point when something should be done. But I can't understand, if this method should return a single "Question" object, or an array of objects. 

        return newQuestion;

    }
}

-(id)initWithQuestion:(NSString*)question details:(NSString*)details
{
    self = [super init];
    if (self) {
        [self setQuestion:question];
        [self setDetails:details]; 
    }
    return self;
}


@end

主控制器MainTableViewController.h:

#import <Foundation/Foundation.h>

@interface MainTableViewController : UITableViewController

@end

MainTableViewController.m:

#import "MainTableViewController.h"
#import "DetailsViewController.h"

@implementation MainTableViewController

- (id) init
{
    self = [super initWithStyle:UITableViewStyleGrouped];
    if (self) {
        UINavigationItem *n = [self navigationItem];

        [n setTitle:@"Questions"];

//maybe an array of questions should be created here? 

    }
    return self;
}

-(id) initWithStyle:(UITableViewStyle)style
{
    return [self init];
}

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 8;
}

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

    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

    cell.textLabel.font = [UIFont systemFontOfSize:15];

    cell.textLabel.numberOfLines = 0;
    cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;

    int row =[indexPath row];

    // code for setting the title's of cells goes in here

    }
    return cell;
}

- (void) tableView:(UITableView*) aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DetailsViewController *detailsViewController = [[DetailsViewController alloc] init];

    [[self navigationController] pushViewController:detailsViewController animated:YES];
}

@end

DetailsViewController.h:

#import <UIKit/UIKit.h>

@interface DetailsViewController : UIViewController
{
    __weak IBOutlet UILabel *details;

}
@end

DetailsViewController.m:

#import "DetailsViewController.h"

@implementation DetailsViewController

@end

在书中有类似的app,并且还创建了一个“Store”对象,它负责创建一个Model对象数组。 我想避免创建“Store”对象,并将所有代码放在MainTabeleViewController中。

感谢您的时间, 任何建议将被认真考虑。

2 个答案:

答案 0 :(得分:1)

设置Model对象的正确方法是什么,以便问题按连续顺序列出,
问题将按照您在didSelectRowAtIndexPath中指定的顺序列出:

并点击它们会显示正确的评论。
您需要告诉第二个控制器选择了哪个项目。点击http://oleb.net/blog/2012/02/passing-data-between-view-controllers/

此时应设置详细问题数组?
应该在程序启动时(或至少在创建使用它的第一个对象时)创建问题和细节(模型)。在您的情况下, init 是初始化模型的好地方。

如何设置这样的数组,以便后者何时可以按顺序排列所有问题?
您应该在整个生命周期中维护模型,如果需要重新排序数组,则需要为此提供逻辑,并决定何时执行此操作。

编辑: 首先你的方法+(id)createQuestion看起来很奇怪,我会删除它。你的模型首先是奇怪的,因为你的对象叫做Question,但你要为很多问题实例化一些数组...... 你的Question对象应该只是一个问题,所以在init方法中你只需要分配或复制传递的初始化参数就可以了。

然后你创建一个quesions对象数组,比如

NSMutableArray *myQuestions = [NSMutableArray array];
for (int i=0; i<5, i++)
{
    Question *question = [[Question alloc] initWithQuestion:@"question" answer:@"answer"];
    [myQuestions addObject:question];
}

答案 1 :(得分:-1)

我不知道男人和女孩你今天如何度过美好的星期六,但我花了它来寻找我的问题的答案。 我对今天结束的方式感到高兴 - 写下我的问题的答案。

@PeacefulWarrior帮我找到了一个解决方案,指向github.com上的这个回购: https://github.com/timd/Pro-iOS-TableViews

仅此一点,迫使我最终弄清楚github如何运作以及如何使用终端上的简单命令“分叉”回购。

此应用的逻辑应如下: 我们保留Model对象,而不在.m文件(createQuestion)中创建复杂的类方法。 我们也没有将用于创建数组(“for”循环)“Question”对象的代码放入控制器的.m文件中。 所有这些事情都不会发生在“商店”对象中。

相反,它发生在AppDelegate.m文件中。 创建一堆“Question”对象的循环放在“application:didFinishLaunchingWithOptions:”中 在该循环中,我们仍然使用创建Question对象的自定义方法 - 类似于我在“createQuestion”方法中尝试做的事情。 我们在AppDelegate.m文件中声明了自定义方法。

我也想知道如何创建一个“创建”方法,它将从两个数组中取出连续的字符串并将它们匹配为1st到1st,2nd到2nd等等。因为在我的情况下顺序非常重要。 答案是 - 给一个“创建”方法一个参数,一个简单的整数“索引”。 后者,当我们在循环中使用该创建方法时(在“application:didFinishLaunchingWithOptions:”方法中),我们将该参数用作“循环”整数。 足够说话,检查代码:

模型。 Question.h:

#import <Foundation/Foundation.h>

@interface Question : NSObject

@property (nonatomic, copy) NSString * question;
@property (nonatomic, copy) NSString * details;

@end

问题:

#import "Question.h"

@implementation Question
@synthesize question, details;

@end

控制器。 MainTableViewController.h:

#import <Foundation/Foundation.h>

@interface MainTableViewController : UITableViewController
@property (atomic, copy) NSArray *tableData;

@end

MainTableViewController.m:

#import "MainTableViewController.h"
#import "DetailsViewController.h"
#import "Question.h"

@implementation MainTableViewController

@synthesize tableData;

- (id) init
{
    self = [super initWithStyle:UITableViewStyleGrouped];
    if (self) {
        UINavigationItem *n = [self navigationItem];
        [n setTitle:@"Questions"];
    }
    return self;
}

-(id) initWithStyle:(UITableViewStyle)style
{
    return [self init];
}

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (self.tableData != nil) {
        return [self.tableData count];
    }
    return 0;
}

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

    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
    cell.textLabel.font = [UIFont systemFontOfSize:15];
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;

    Question *ques = [self.tableData objectAtIndex:indexPath.row];

    cell.textLabel.text = ques.question;

    return cell;
}

- (void) tableView:(UITableView*) aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DetailsViewController *detailsViewController = [[DetailsViewController alloc] init];
        detailsViewController.question= [self.tableData objectAtIndex:indexPath.row];
      [[self navigationController] pushViewController:detailsViewController animated:YES];
}

@end

DetailsViewController.h:

#import <UIKit/UIKit.h>
#import "Question.h"

@interface DetailsViewController : UIViewController

@property (atomic, strong) Question *question;
@property (atomic, weak) IBOutlet UILabel *details;

@end

DetailsViewController.m:

#import "DetailsViewController.h"

@interface DetailsViewController ()

@end

@implementation DetailsViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    self.details.text = self.question.details;
}

@end

现在是AppDelegate.h:

#import <UIKit/UIKit.h>

@class Question;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, strong) NSMutableArray *tableData;

-(Question *)createWithDetailsIndex:(int)index;

@end

AppDelegate.m:

#import "AppDelegate.h"
#import "MainTableViewController.h"
#import "Question.h"

@implementation AppDelegate

@synthesize tableData;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.

    NSUInteger numberOfQuestions = 8;
    self.tableData = [[NSMutableArray alloc] initWithCapacity:numberOfQuestions];

    for (NSUInteger i=0 ; i< numberOfQuestions; i++) {
        Question *question1 = [self createWithDetailsIndex:i];
        [self.tableData addObject:question1];
    }

    MainTableViewController *mainTableViewController = [[MainTableViewController alloc] init];

    mainTableViewController.tableData = (NSArray *)self.tableData;

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:mainTableViewController];

    [[self window] setRootViewController:navController];

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}


-(Question *)createWithDetailsIndex:(int)index

{
    Question *q = [[Question alloc] init];

    NSArray *arrayOfQuestions = [NSArray arrayWithObjects:
                                 @"1. Questions?",
                                 @"2. Questions?",
                                 @"3. Questions?",
                                 @"4. Questions?",
                                 @"5. Questions?",
                                 @"6. Questions?",
                                 @"7. Questions?",
                                 @"8. Questions?", nil];


    NSArray *arrayOfDetails = [NSArray arrayWithObjects:
                               @"1th question, place description in here",
                               @"2nd question, place description in here",
                               @"3rd question, place description in here",
                               @"4th question, place description in here",
                               @"5th question, place description in here",
                               @"6th question, place description in here",
                               @"7th question, place description in here",
                               @"8th question, place description in here", nil];

    q.question = [arrayOfQuestions objectAtIndex:index];
    q.details= [arrayOfDetails objectAtIndex:index];

    return q;
}

@end

感谢您的时间,祝您的餐桌好运!