Combine static and prototype content in a table view

前端 未结 8 1005
遇见更好的自我
遇见更好的自我 2020-11-28 23:57

Is there a way to combine static tableview cells (static content) with dynamic tableview cells (prototype content) using storyboard?

相关标签:
8条回答
  • 2020-11-29 00:17

    I suggest you treat your table as dynamic, but include the cells you always want at the top. In the Storyboard, place a UITableViewController and have it use a dynamic table. Add as many UITableViewCell prototypes to the table as you need. Say, one each for your static cells, and one to represent the variable cells.

    In your UITableViewDataSource class:

    #define NUMBER_OF_STATIC_CELLS  3
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [self.dynamicModel count] + NUMBER_OF_STATIC_CELLS;
    }
    

    and, then

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        if (indexPath.row < NUMBER_OF_STATIC_CELLS) {
            // dequeue and configure my static cell for indexPath.row
            NSString *cellIdentifier = ... // id for one of my static cells
        } else {
            // normal dynamic logic here
            NSString *cellIdentifier = @"DynamicCellID"
            // dequeue and configure for [self.myDynamicModel objectAtIndex:indexPath.row]
        }
    }
    
    0 讨论(0)
  • 2020-11-29 00:17

    Unfortunately, this is not possible since static table views must be in a UITableViewController and that only allows one tableview.

    What you need to do is make three more dynamic UITableviewCell's and load them individually for the first three rows where you want the static content.

    If you aren't sure how to do this, let me know and I can find some code.

    0 讨论(0)
  • 2020-11-29 00:23

    Since no one has actually provided a real answer to the problem (using both static and prototype cells in the same table view), I figured I'd chime in. It can be done!

    Create your static cells as you see fit. For the sections that need a dynamic cell, if you are NOT using standard UITableViewCell type, you'll need to create your custom one in a separate Nib, otherwise you can use the standard ones. Then implement the following delegates. Basically for each of these delegates, for the static stuff we want to call super, for the dynamic, we return our values.

    First, IF you need to selectively show your dynamic section, you'll want to implement the numberOfSectionsInTableView (otherwise you can leave this delegate out):

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        int staticSections = 1;
        int dynamicSections = 1;
        if (SOME_BOOLEAN) {
            return staticSections + dynamicSections;
        } else {
            return staticSections;
        }
    }
    

    Then, you need to implement numberOfRowsInSection:

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        if (section == 1) {
            return A_COUNT;
        } else {
            return [super tableView:tableView numberOfRowsInSection:section];
        }
    }
    

    Then, you need to implement heightForRowAtIndexPath:

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.section == 1) {
            return 44.0f;
        } else {
            return [super tableView:tableView heightForRowAtIndexPath:indexPath];
        }
    }
    

    Then indentationLevelForRowAtIndexPath:

    - (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.section == 1) {
            return 1; // or manually set in IB (Storyboard)
        } else {
            return [super tableView:tableView indentationLevelForRowAtIndexPath:indexPath]; // or 0
        }
    }
    

    Finally, cellForRowAtIndexPath:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.section == 1) {
            SomeObject *obj = self.someArray[indexPath.row];
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"DynamicCell" forIndexPath:indexPath];
            cell.textLabel.text = obj.textValue;
            return cell;
        } else {
            return [super tableView:tableView cellForRowAtIndexPath:indexPath];
        }
    }
    
    0 讨论(0)
  • 2020-11-29 00:25

    I had a problem, although it was a slight variant of this. I actually wanted to mix dynamic and static cells but in different groups. Meaning group 1 would have static only cells and group 2 would have dynamic cells.

    I accomplished this by actually hard coding static cell values (based on their prototype cell identifiers). The dynamic sections would have normal dynamically populated content. Here is some example code in case anyone else has the same issue:

    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    {    
        if (section == 1){
            return @"Dynamic Cells";
        }
        if (section == 0){
            return @"Static Cells";
        }
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        if (section == 0) {
            return 1; //However many static cells you want
        } else {
            return [_yourArray count];
        }
    }
    
    -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
    {
        if (indexPath.section == 0) {
            NSString *cellIdentifier = @"staticCellType";   
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    
            if (cell == nil) {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
            }
    
            cell.textLabel.text = @"some static content";        
            return cell;
    
        } else if (indexPath.section == 1){
    
            NSString *cellIdentifier = @"dynamicCellType";
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    
            if (cell == nil) {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
            }
    
            cell.textLabel.text = [_yourArray objectAtIndex:indexPath.row];
            return cell;
    
        } 
        return nil;
    
    }
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 2;
    }
    
    0 讨论(0)
  • 2020-11-29 00:25

    You can't have one tableview be static and the other dynamic in the same view controller so you will need to make them both dynamic. In the first tableview you will configure the cells in code on initializing the view controller never update them.

    1. Add a UIViewController to your storyboard.
    2. Add two Table Views (Not TableViewControllers) to the UIView Controller.
    3. Select each tableView and configure both for dynamic cells.
    4. Build and attach your view controller. 2 tableview on a single view explains that step.

    As another option you can achieve a similar look by embedding your dynamic tableview in part of a view similar to the link in step 4 and then do whatever you wanted to in the rest of the view to setup what you were planning to do with static cells by using scrollviews, labels, and buttons.

    0 讨论(0)
  • You could also create buttons (one for each static cell you have) that are styled like your cells and place them in the tableHeaderView or tableFooterView of the UITableView; those buttons are just views after all.

    You'll need to add some logic for making selections on the buttons vs. the cells so it maintains the usual look and feel.

    Of course, this assumes that you want to insert static cells into your table view at the top or bottom of the table.

    0 讨论(0)
提交回复
热议问题