部分中的数组问题(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

NSFetchedResultsController - TableView 中的 UI 更新不完整

将tableview中的所有值保存到iOS中的数组?

如何使节标题锚定到多节表格视图的顶部?

对象数组中的 UITableView 部分

tableview 删除部分中的最后一行