【问题标题】:UITableView like gridViewUITableView 类似于 gridView
【发布时间】:2013-01-10 05:34:32
【问题描述】:

我有一个 NSMutableArray,我在其中存储从服务 url 获取的项目并完成解析。我在 UITableView 中显示数组项,其行为类似于 gridview(每行 4 列,行数取决于数组计数)。它是比如显示一周内所有可用的在线考试时段。所以我必须一个一个地加载每一天的时间安排,如果所有的插槽都是为特定的一天保留的,那么应该显示那一天的消息(没有可用的插槽)然后在 tableView 中加载下一个数组项。但我只能获得最后一天的空缺。

我必须得到以下格式:

10/1/2013

10:00 AM    11:00 AM   12:00 PM   1:00 PM
2:00 PM

11/1/2013

11:00 AM     12:00 PM   1:00 PM    2:00 PM 

12/1/2013

   No slot available

13/1/2013

10:00 AM    11:00 AM   12:00 PM   1:00 PM
2:00 PM     3:00 PM

............

到目前为止,我正在使用相同的 tableview 并分别加载特定日期的每个数组项。但我只能获得最后一天的时间

我怎样才能获得这种特殊格式?

任何关于使用哪个控件或如何使用同一个 tableView 的建议/建议都会很明显。

编辑:

-(void)LoadWeekSlots
{

    for(int i=0;i<7;i++)
    {

      NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

        NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
        [offsetComponents setDay:i];
        NSDate *nextDate = [gregorian dateByAddingComponents:offsetComponents toDate: [NSDate date] options:0];
        [offsetComponents release];
        [gregorian release];
        NSLog(@"%@",nextDate);

        NSDateFormatter *df=[[[NSDateFormatter alloc]init] autorelease];
        df.dateFormat = @"yyyy-MM-dd";
        getdateinmmformat=[[NSString stringWithFormat:@"%@",[df stringFromDate:nextDate]] componentsSeparatedByString:@""];
        NSLog(@"%@",getdateinmmformat);
        result=[[getdateinmmformat valueForKey:@"description"] componentsJoinedByString:@""];
        weekdayString=[nextDate descriptionWithCalendarFormat:@"%A" timeZone:nil locale:[[NSUserDefaults standardUserDefaults]dictionaryRepresentation]];
        NSLog(@"Day :%@",weekdayString);
        selectedtableView=i;
        [self LoadSlots];
        NSLog(@"%@",arr1);
   }
}

-(void)LoadSlots{

// calling the service url and taking the values in NSMutableArray (arr1)
     [self CheckArray];

}


-(void)CheckArray{


    NSMutableArray *yourArray = [[NSMutableArray alloc] init];

    for (NSDictionary *dict in arr3) {

        NSString *str=[dict valueForKey:@"Code"];

        NSString*newstr=  [str stringByReplacingOccurrencesOfString:@"," withString:@""];

        [yourArray addObject:newstr];

    }

    BOOL isTheObjectThere = [yourArray containsObject:weekdayString];

    if([arr1 count]==0 && isTheObjectThere==YES)
    {

        displayError  =[[UILabel alloc]init];
        [displayError setFrame:CGRectMake(0,390,320,200)];
        displayError.textAlignment=UITextAlignmentLeft;
        displayError.backgroundColor=[UIColor clearColor];
        NSString *string1=@" No slot available.";
       displayError.text=[NSString stringWithFormat:@"%@ ",string1];
       displayError.textColor=[UIColor redColor];
        displayError.shadowColor=[UIColor blackColor];
        displayError.font=[UIFont fontWithName:@"Verdana-Italic" size:14];
        [testscroll addSubview:displayError];
       float fscrview =displayError.frame.origin.y + displayError.frame.size.height+ 60;
        testscroll.contentSize=CGSizeMake(320, fscrview);

    }


    else
    {
      sections=[[NSMutableArray alloc] init];
        for(int s=0;s<1;s++)
          {
            NSMutableArray *section=[[NSMutableArray alloc] init];
             for(int i=0;i<[arr1 count];i++)
                {
                    Item *item=[[Item alloc] init];
                    NSString *eventName=[[arr1 objectAtIndex:i]objectForKey:@"TimeStart"];

                    item.TimeStart=eventName;
                    [section addObject:item];

                }
                [sections addObject:section];

            }




            self.tableView=[[UITableView alloc]initWithFrame:CGRectMake(0,390,320,[arr1 count]*40) style:UITableViewStylePlain];
            self.tableView.delegate = self;
            self.tableView.dataSource = self;
            self.tableView.scrollEnabled=NO;
            [testscroll addSubview:self.tableView];
            [self.tableView reloadData];
             self.tableView.frame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.frame.size.width, self.tableView.contentSize.height);
            float fscrview = self.tableView.frame.origin.y + self.tableView.frame.size.height + 10;
            testscroll.contentSize=CGSizeMake(320, fscrview);
            testscroll.scrollEnabled=YES;
            }

        }

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 1;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSMutableArray *sectionItems=[sections objectAtIndex:indexPath.section];
    int numRows=[sectionItems count]/4;
    if(numRows==0)
    {
        return 80;
    }

    else
    {

        NSArray* items = [sections objectAtIndex:indexPath.section];
        int total = [items count];
        float f = (float)total /4;
        int numberOfGridRows = ceilf(f);
        NSLog(@"\n\n Rows :>> %d",numberOfGridRows);
        if(numberOfGridRows==1)
        {
            return numberOfGridRows * 100.0;

        }

        else if(numberOfGridRows==2)
        {
            return numberOfGridRows * 70.0;

        }
        else if(numberOfGridRows==3)
        {
            return numberOfGridRows * 60.0;

        }
        else if(numberOfGridRows==4)
        {

            return numberOfGridRows * 70.0;

        }
        if(numberOfGridRows>4 && numberOfGridRows<8)
        {
             return numberOfGridRows * 65.0;


        }
        else
        {
          return numberOfGridRows * 40.0 ;
        }



    }
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *hlCellID=@"hlCellID";

    UITableViewCell* hlcell=[tableView dequeueReusableCellWithIdentifier:hlCellID];

    if(hlcell == nil)
    {
        hlcell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault    reuseIdentifier:hlCellID]autorelease];

        hlcell.accessoryType = UITableViewCellAccessoryNone;
        hlcell.selectionStyle = UITableViewCellSelectionStyleNone;    
    }
    int section=indexPath.section;
    NSMutableArray *sectionItems=[sections objectAtIndex:section];
    int n=[sectionItems count];
    int i=0,i1=0;
    while(i<n)
    {
        int yy= 4+i1*34;
        int j=0;
        for(j=0;j<4;j++)
        {
            if(i>=n)break;
           Item *item=[sectionItems objectAtIndex:i];
            CGRect rect=CGRectMake(0+70*j,yy,79,40);
            UIButton *button=[[UIButton alloc] initWithFrame:rect];
            [button setFrame:rect];
            [button setContentMode:UIViewContentModeLeft];
            button.titleLabel.font = [UIFont systemFontOfSize:14];
            NSString *settitle=[NSString stringWithFormat:@"%@",item.TimeStart];
            [button setTitle:settitle forState:UIControlStateNormal];
            NSString *tagValue=[NSString stringWithFormat:@"%d%d",indexPath.section+1,i];
            button.tag=[tagValue intValue];
            [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
            [button setShowsTouchWhenHighlighted:YES];     
            [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
           [hlcell.contentView addSubview:button];
            [button release];
            i++;




        }
        i1=i1+1;
    }
    return hlcell;

}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [sections count];
}   

这是我做的代码。

【问题讨论】:

  • 你能放一些你写的代码吗?以便我们可以尝试纠正错误。

标签: iphone ios objective-c uitableview uicollectionview


【解决方案1】:

尝试我下面的代码中的一些代码...删除一些对您无用的其他代码..

我有这种类型的要求,我用我的波纹管代码和逻辑来完成它......还看到我认为你想要类似的东西的图像......

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [_grids count];
}

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

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    NSArray* items = [_grids objectAtIndex:indexPath.section];
    
    //number of rows in one grid if one row will have 4 items
    //    float totalRow = ceilf(items.count/4);
    int total = [items count];
    
    float f = (float)total /4;
    int numberOfGridRows = ceilf(f);
    NSLog(@"\n\n Rows :>> %d",numberOfGridRows);
    //height of table row
    return numberOfGridRows * 36.0 + 120;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return [NSString stringWithFormat:@"Grid %d", section];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{    
    static NSString* cellIdentifier = @"gridCell";

    UITableViewCell *gridCell = [tableView dequeueReusableCellWithIdentifier:nil];
    
    if(gridCell == nil)        
    {
        gridCell =  [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
        
        gridCell.accessoryType = UITableViewCellAccessoryNone;
        
        gridCell.selectionStyle = UITableViewCellSelectionStyleNone;
        
    }
//    UIImageView *img = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"lion.jpg"]];
//    [img setFrame:CGRectMake(0, 0, 320, 120)];
//    [gridCell.contentView addSubview:img];
    
    UIImageView *imgUser = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"noImage.png"]];
    [imgUser setFrame:CGRectMake(5, 5, 100, 115)];
    [gridCell.contentView addSubview:imgUser];
    
    UILabel *lbl = [[UILabel alloc]init];
    lbl.text = @"Dr. P.R. Joshi";
    lbl.font = [UIFont fontWithName:@"Helvetica-Bold" size:15];
    [lbl setFrame:CGRectMake(110, 5, 200, 31)];    
    [gridCell.contentView addSubview:lbl];

    UILabel *lblAddress = [[UILabel alloc]init];
    [lblAddress setFrame:CGRectMake(110, 31, 200, 31)];        
    lblAddress.text = @"706,Atlanta Tower,Gulbai Tekra,Ahemdabad-007.";
    lblAddress.lineBreakMode = UILineBreakModeWordWrap;
    lblAddress.numberOfLines = 0;
    lblAddress.font = [UIFont fontWithName:@"Helvetica" size:12];
//    CGSize sizeToMakeLabel = [lblAddress.text sizeWithFont:lblAddress.font]; 
    lblAddress.frame = CGRectMake(lblAddress.frame.origin.x, lblAddress.frame.origin.y, 
                             200,[self calculateHeightOfTextFromWidth:lblAddress.text :lblAddress.font :200 :UILineBreakModeWordWrap] ); 

    lblAddress.textColor = [UIColor darkGrayColor];

    [gridCell.contentView addSubview:lblAddress];
    
    DYRateView *rateView = [[[DYRateView alloc] initWithFrame:CGRectMake(110, lblAddress.frame.origin.y + lblAddress.frame.size.height + 5, 160, 14)] autorelease];
    rateView.rate = 4.5;
    rateView.alignment = RateViewAlignmentLeft;
    [gridCell.contentView addSubview:rateView];
    
    UIImageView *imgArrow = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"left-arrow-right-md.png"]];
    [imgArrow setFrame:CGRectMake(300, 57, 12, 18)];
    [gridCell.contentView addSubview:imgArrow];
    
    NSArray* items = [_grids  objectAtIndex:indexPath.section];
    
    int imageIndex = 0;
    
    int yOffset = 4;
    
    while (imageIndex < items.count)        
    {
        int yPos =  7 + yOffset * 30;
        
        for(int i = 0; i < 4; ++i)
        {
            CGRect  rect = CGRectMake((0 + i * 80), yPos, 80, 31);
            
            if (imageIndex < [items  count]) {
                
                UIImageView* imageView = [self gridImageRect:rect forImage:[items objectAtIndex:imageIndex]];
                
                [gridCell.contentView addSubview:imageView];
                [imageView release];
                
                UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
                button.frame = rect;
                button.tag = imageIndex;
                [button addTarget:self 
                           action:@selector(btnTemp_Clicked:)
                 forControlEvents:UIControlEventTouchDown];
                
                [button setTitle:[NSString stringWithFormat:@"Title %d%d%d",indexPath.section,indexPath.row,imageIndex] forState:UIControlStateNormal];
                [button.titleLabel setFont:[UIFont fontWithName:@"Helvetica-Bold" size:12]];

//                [button.titleLabel setTextColor:[UIColor blueColor]];
                [button setTitleColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"circle03.jpg"]] forState:UIControlStateNormal ];                
                [button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted ];
                
                [button setNeedsDisplay];
                
                [gridCell.contentView addSubview:button];
                
                //            rect = CGRectMake(((80 * i)-4), (yPos+44), 80, 12);
                //            
                //            
                //            
                //            UILabel* label = [self descriptionOfImage:imageIndex inRect:rect];
                //            
                //            [gridCell.contentView addSubview:label];
                //            
                //            [label release];
            }
            ++imageIndex;
        }
        ++yOffset;
    }
    return gridCell;
}

-(float) calculateHeightOfTextFromWidth:(NSString*) text: (UIFont*)withFont: (float)width :(UILineBreakMode)lineBreakMode
{
    [text retain];
    [withFont retain];
    CGSize suggestedSize = [text sizeWithFont:withFont constrainedToSize:CGSizeMake(width, FLT_MAX) lineBreakMode:lineBreakMode];
    
    [text release];
    [withFont release];
    
    return suggestedSize.height;
}

-(IBAction)btnTemp_Clicked:(id)sender{
    UIButton *btn = (UIButton *)sender;
    NSLog(@"Selected Image : %d  Button Title is ==>> %@",btn.tag,btn.titleLabel.text);
}

-(UIImageView *)gridImageRect:(CGRect)rect  forImage:(UIImage *)image
{
    UIImageView* imageView = [[UIImageView alloc] initWithFrame:rect];
    imageView.image = image;
    
    return imageView;
}

-(UILabel *)descriptionOfImage:(int)imageNumber inRect:(CGRect)rect
{
    UILabel *label = [[UILabel alloc] initWithFrame:rect];
    
    label.text = [NSString stringWithFormat:@"Image  %d", imageNumber + 1];
    
    label.textColor = [UIColor blackColor];
    
    label.backgroundColor = [UIColor clearColor];
    
    label.textAlignment = UITextAlignmentCenter;
    
    label.font = [UIFont fontWithName:@"ArialMT" size:12];
    
    return label;
}

查看此代码输出的屏幕截图...

另请参阅下面的链接以获取UIGridView 演示和教程。..

  1. UIGridView

  2. GMGridView

    希望对你有帮助...

【讨论】:

  • 嗨,帕拉斯,我想知道在这里复制粘贴所有代码有什么意义。包括你的逻辑和一切。这实际上会让用户感到困惑。
  • 我同意提供你所拥有的一切总是更好的。因此,用户可以决定采取什么,不采取什么。但我认为@arizah 已经设法展示了表格视图。他实际上正在与我认为的逻辑作斗争。那时如果你提供这么长的代码。我不明白重点。感谢您还提供了对他有帮助的屏幕截图。但我不同意你将所有代码粘贴到 cellForRowAtIndexPath、calculateHeightOfTextFromWidth、btnTemp_Clicked、gridImageRect、descriptionOfImage 等中。
  • 但是他到底想要什么伙计??
  • @ParasJoshi 他想要什么,我们需要问他。但我该死的确定他不想要calculateHeightOfTextFromWidth、btnTemp_Clicked、gridImageRect、descriptionOfImage:p
  • @Rushi 哦,好吧,伙计,如果我明白 arizh 到底想要什么,那么我删除那个帖子伙计.. 谢谢.. :)
【解决方案2】:

首先,您最好使用UICollectionView 代替UITableView 来表示网格。它更干净。

接下来,在您的特定情况下,由于您尝试在 1 行中显示 4 个网格,因此您需要在 cellForRow 中的 UItableView 委托中使用模 % 运算符。还将uitableview委托中的项目数调整为(totalitems)/ 4。我敢打赌,还有一些我忘了提及的事情。

我强烈建议您花时间迁移到 UICollectionView 它的清洁工...

【讨论】:

    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2014-08-13
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      相关资源
      最近更新 更多