不想告诉你我花了多少时间来解决这个看似简单的任务。 完成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中。
感谢您的时间, 任何建议将被认真考虑。
答案 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
感谢您的时间,祝您的餐桌好运!