Giter VIP home page Giter VIP logo

Comments (3)

wtmoose avatar wtmoose commented on June 5, 2024

But since we are lazy loading child nodes, the indexPath of a particular node changes depending on what is collapsed or expanded in the table.

If you've put the relevant data in the data model, then you'd get it like this:

id item = [self.indexPathController.dataModel itemAtIndexPath:indexPath];

where id is replaced by whatever data type you've put in the data model. In your case, the data type is TLIndexPathTreeItem, so you would get the data like:

TLIndexPathTreeItem *item = [self.indexPathController.dataModel itemAtIndexPath:indexPath];
id myDataObject = item.data;

If the relevant data does not live in the data model, then you can look it up elsewhere by identifier:

id identifier = [self.indexPathController.dataModel identifierAtIndexPath:indexPath];
id myDataObject = [self someMethodThatRetrievesDataById:identifier];

is called prior to cellForRowAtIndexPath:, so if we want to set the cell height dynamically we have to do it before the cell is created, and thus based on its contents.

You can write your own implementation of heightForRowAtIndexPath, but TLTableViewController provides a default implementation that uses the prototype method discussed here. Basically, the controller dequeues instances of your cells internally and uses them for height calculations. If your cell implements the TLDynamicSizeViewProtocol, it calculates the height by calling the cell's sizeWithData: protocol method. See the DynamicHeightCell class in the "Dynamic Height" sample project for an example of a sizeWithData implementation. If your cell does not implement TLDynamicSizeViewProtocol, then size of the prototype cell is returned.

So if you're using storyboard, the default implementation of heightForRowAtIndexPath automatically returns any custom cell heights you've made in the storyboard. And if the heights need to vary based on the data that goes in the cell, then implement TLDynamicSizeViewProtocol.

Is that what you were looking for?

from tlindexpathtools.

ebgraham avatar ebgraham commented on June 5, 2024

Thanks, TLIndexPathTreeItem *item = [self.indexPathController.dataModel itemAtIndexPath:indexPath] was the trick. I didn't realize that children were getting added to dataModel as I didn't see it in willChangeNode. I spent some time a while ago struggling to get Dynamic Height to work (and actually in the example if you decrease the label font size in storyboard it breaks), so I ended up estimating height based on font size in heighForRowAtIndexPath.

from tlindexpathtools.

wtmoose avatar wtmoose commented on June 5, 2024

I spent some time a while ago struggling to get Dynamic Height to work (and actually in the example if you decrease the label font size in storyboard it breaks), so I ended up estimating height based on font size in heighForRowAtIndexPath.

The example project is using Auto Layout so you may get unexpected results if the constraints are in a weird state. If you just change the label font size, the Auto Layout system inserts some constraints to maintain the original frame and these constraints are overriding the result of [label sizeToFit]. The way to fix it (besides turning off Auto Layout) is:

  1. Note the width of the label
  2. Change the font size
  3. Se the label to it's intrinsic size by selecting it and typing "command" + "=".
  4. Drag the label's width back the value noted in (1).

I didn't realize that children were getting added to dataModel as I didn't see it in willChangeNode.

Right. The data model items always reflect the current set of rows (in fact the primary purpose of the data model is to fulfill the table view's dataSource delegate methods, numberOfRowsInSection, ect.).

The willChangeNode delegate method only gets called when nodes are expanded and collapsed. It doesn't get called on hiding or showing. I could add delegate methods for hide and show if you think it's useful.

from tlindexpathtools.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.