部分中的数组问题(TableView)
Posted
技术标签:
【中文标题】部分中的数组问题(TableView)【英文标题】:Issue with arrays in sections (TableView) 【发布时间】:2011-11-27 10:07:17 【问题描述】:我有一个问题,我的数组未设置为我想要的部分。 在下面的代码中:
(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section只有第二个数组被设置到该部分中,但它在其他 2 个部分上重复它自己,并且不将其他部分与其余数组一起设置。
我的另一件事 - 如果我放入一个数组(比如说第三个)超过 5 行,如第一个和第二个数组,它会给我错误:由于未捕获的异常“NSRangeException”而终止应用程序,原因: '* -[__NSArrayM objectAtIndex:]: 索引 5 超出范围 [0 .. 4]'
我做错了什么?? 感谢您的帮助!
代码:
(sectionArray 和 dataArray 是我的 .h 文件中的 NSMutableArray 变量)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
sectionArray = [NSArray arrayWithObjects:@"section1", @"section2", @"section3", nil];
return [sectionArray count];
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection: (NSInteger)section
NSString *sectionHeader = nil;
if(section == 0)
sectionHeader = @"אתרים חשובים";
if(section == 1)
sectionHeader = @"מתעניינים";
if(section == 2)
sectionHeader = @"טלפונים שימושיים";
return sectionHeader;
// Returns the number of rows in a given section.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
if(section == 0)
dataArray = [[NSMutableArray alloc] initWithObjects:
@"אתר אורנים",
@"כניסה למערכת ניהול שיעורים",
@"אלפון אנשי סגל",
@"אתר אגודת הסטודנטים",
@"מפת אורנים", nil];
if(section == 1)
dataArray = [[NSMutableArray alloc] initWithObjects:
@"תנאי קבלה",
@"שאלות נפוצות",
@"הרשמה אונליין",
@"יצירת קשר עם יועץ לימודים",
@"תחבורה ציבורית", nil];
if(section == 2)
dataArray = [[NSMutableArray alloc] initWithObjects:
@"מרכז המידע וההרשמה",
@"שכר לימוד",
@"שכר לימוד (מספר נוסף)",
@"קופת אורנים",
@"מרכז ההשאלה בספריה", nil];
/*
@"תמיכת הספריה",
@"מעונות",
@"מכלול",
@"רכז בטחון",
@"שער",
@"אגודת הסטודנטים",
@"רדיו אורנים",
@"פקולטות:",
@"מנהל תלמידים",
@"מנהל תלמידים (מספר נוסף)", nil];
*/
return [dataArray count];
// Returns the cell for a given indexPath.
- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath: (NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
// Create the cell.
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.textLabel.text = [dataArray objectAtIndex:indexPath.row];
cell.textLabel.textAlignment = UITextAlignmentRight;
float Rvalue = (1.0 * 000) / 255;
float Gvalue = (1.0 * 139) / 255;
float Bvalue = (1.0 * 69) / 255;
cell.textLabel.textColor = [UIColor colorWithRed:Rvalue green:Gvalue blue:Bvalue alpha:1.0f];
UIImage *cellImage = [UIImage imageNamed:@"oranimCellIco.png"];
cell.imageView.image = cellImage;
return cell;
【问题讨论】:
【参考方案1】:首先,您应该在委托方法之外创建和存储数据。在-(void)viewDidLoad;
或-(id)init;
,其实都无所谓。重要的是,您的数据数组(或数组或数组数组)应该在委托调用之前创建,并且在表视图调用它的数据委托时应该保持一致。
比方说一些 viewController.h
@property(nonatomic, retain)NSArray data;
@property(nonatomic, retain)NSArray sections;
以及对应的viewController.m
-(void)viewDidLoad
[super viewDidLoad];
self.sections = [[NSArray alloc] initWithObjects:@"אתרים חשובים",@"מתעניינים",@"טלפונים שימושיים",nil];
self.data = [[NSArray alloc]initWithObjects:
[[NSArray alloc] initWithObjects:
@"אתר אורנים",
@"כניסה למערכת ניהול שיעורים",
@"אלפון אנשי סגל",
@"אתר אגודת הסטודנטים",
@"מפת אורנים", nil],
[[NSArray alloc] initWithObjects:
@"תנאי קבלה",
@"שאלות נפוצות",
@"הרשמה אונליין",
@"יצירת קשר עם יועץ לימודים",
@"תחבורה ציבורית", nil],
[[NSArray alloc] initWithObjects:
@"מרכז המידע וההרשמה",
@"שכר לימוד",
@"שכר לימוד (מספר נוסף)",
@"קופת אורנים",
@"מרכז ההשאלה בספריה", nil]nil];
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return [self.sections count];
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
return [self.sections objectAtIndex:section];
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
NSArray* dataArray = [self.data objectAtIndex:indexPath.section];
return [dataArray count];
- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath: (NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
// Create the cell.
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
NSArray* dataArray = [data objectAtIndex:indexPath.section];
cell.textLabel.text = [dataArray objectAtIndex:indexPath.row];
cell.textLabel.textAlignment = UITextAlignmentRight;
cell.textLabel.textColor = [UIColor colorWithRed:0.0 green:139.0/255.0 blue:69.0/255.0 alpha:1.0];
UIImage *cellImage = [UIImage imageNamed:@"oranimCellIco.png"];
cell.imageView.image = cellImage;
return cell;
קצת סדר בקוד לא יפגע אף פעם :)
【讨论】:
אריאל המון תודה ואכן אכן הדברים החשובים זה סדר, לאט לאט אני לומד。 לגביהקוד,אידרויהאותויוקמומתאותםאותםמותועםאותםמותאותםאותםמותיםםאבלזה .data objectAtIndex:indexPath.section];返回[数据数组计数]; זה רושם לי את השגיאה:使用未声明的标识符“indexpath” אריאל בסוף הסתדרתי בדרך אחרת אחרי יומיים שאני יושב על זה! המון המון תודה על העזרה! 关于你的问题,这是我的错误......代码是我在浏览器中编写的,没有在 XCode 中检查。应该有: - (NSInteger)tableView:(UITableView )tableView numberOfRowsInSection:(NSInteger)section NSArray dataArray = [self.data objectAtIndex:section];返回[数据数组计数]; תודהתודהרית,אתהילאמורהההאםייייייייכולכוללנגןלנגןיללר,לדוגמאליללשלשליקקיקקלוחץעלעלרשלשלטאבר?上一页 上一页 下一页עשיתיאתזהכברעלשארהכפתוריםבתוכניתאבלעלהטאבברלאהצלחתי。 您必须为此子类化 tabbar 或 tabBarController 类(也许甚至类别都可以完成工作,但在类别的情况下,您必须使用方法调配)。顺便说一句,如果您不让用户选择轻松禁用它,那么对许多声音来说都是不好的。【参考方案2】:问题是,它没有定义 TableView 将如何调用您的委托方法。在您的代码中,只有在此部分的 tableView:numberOfRowsInSection
之后才为每个部分调用 tableView:cellForRowAtIndexPath:
时,它才会起作用。
如果您同时存储所有您有权访问所有部分的数据,您的问题将得到解决。例如,您可以使用 3 个不同的数组(每个部分一个)或使用数组数组来存储项目。
【讨论】:
感谢丹尼斯的帮助,但你能给我举个例子吗? 查看@Ariel 的回答,他是如何初始化 self.data 数组的以上是关于部分中的数组问题(TableView)的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中的数组中使用多个部分和多个字典填充 TableView