•Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using...

123
#WWDC17 © 2017 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple. Trevor Cortez, Localization Engineer Parry Panesar, tvOS Engineer Jeremy Foo, tvOS Engineer Advances in TVMLKit Session 202 App Frameworks

Transcript of •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using...

Page 1: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

#WWDC17

© 2017 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.

Trevor Cortez, Localization Engineer Parry Panesar, tvOS Engineer Jeremy Foo, tvOS Engineer

•Advances in TVMLKit • Session 202

App Frameworks

Page 2: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

•Right-to-left languages •Template optimizations •Development using Web Inspector

Page 3: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Trevor Cortez, Localization Engineer

•Right-to-Left Languages

Page 4: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Right-to-Left Languages

Arabic and Hebrew new in tvOS 11

Page 5: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Right-to-Left Languages

Arabic and Hebrew new in tvOS 11

400 million speakers worldwide

Page 6: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data
Page 7: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data
Page 8: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data
Page 9: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data
Page 10: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Right-to-Left Languages

Arabic and Hebrew new in tvOS 11

400 million speakers worldwide

Built in support in TVMLKit

Page 11: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Right-to-Left Languages Adding support

Add Arabic or Hebrew in your Project Settings

Localizing with Xcode 9 Tuesday 10:20AM

Page 12: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Right-to-Left Languages

Layout

Text alignment

Images

Page 13: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Right-to-Left Languages Layout

New context aware values for tv-align and tv-position

leading, trailing resolve to right and left at runtime

NEW

Page 14: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Right-to-Left Languages Layout

New context aware values for tv-align and tv-position

leading, trailing resolve to right and left at runtime

NEW

.collectionListLockupImage { tv-position: right; } .sectionHeaderTitle { tv-align: left; }

Page 15: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

New context aware values for tv-align and tv-position

leading, trailing resolve to right and left at runtime

Right-to-Left Languages Layout

NEW

.collectionListLockupImage { tv-position: right; } .sectionHeaderTitle { tv-align: left; }

Page 16: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

New context aware values for tv-align and tv-position

leading, trailing resolve to right and left at runtime

Right-to-Left Languages Layout

NEW

.collectionListLockupImage { tv-position: right; } .sectionHeaderTitle { tv-align: left; }

.collectionListLockupImage { tv-position: trailing; } .sectionHeaderTitle { tv-align: leading; }

Page 17: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Adjust value inside media query for Layout Direction

•Margin

•Padding

Right-to-Left Languages Layout

NEW

Page 18: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

@media (layout-direction: ltr) { .my_interesting_image { margin: 0 12 0 0; } } @media (layout-direction: rtl) { .my_interesting_image { margin: 0 0 0 12; } }

Adjust value inside media query for Layout Direction

•Margin

•Padding

Right-to-Left Languages Layout

NEW

Page 19: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Adjust value inside media query for Layout Direction

•Margin

•Padding

Right-to-Left Languages Layout

@media (layout-direction: ltr) { .my_interesting_image { margin: 0 12 0 0; } } @media (layout-direction: rtl) { .my_interesting_image { margin: 0 0 0 12; } }

NEW

Page 20: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Adjust value inside media query for Layout Direction

•Margin

•Padding

Right-to-Left Languages Layout

@media (layout-direction: ltr) { .my_interesting_image { margin: 0 12 0 0; } } @media (layout-direction: rtl) { .my_interesting_image { margin: 0 0 0 12; } }

NEW

Page 21: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Left Center Right

Lorem Ipsum Lorem Ipsum Lorem Ipsum

أبجد هوز حطي أبجد هوز حطي أبجد هوز حطي

Right-to-Left Languages Text alignment

Page 22: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Left Center Right

Lorem Ipsum Lorem Ipsum Lorem Ipsum

أبجد هوز حطي أبجد هوز حطي أبجد هوز حطي

Right-to-Left Languages Text alignment

Page 23: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Left Center Right Natural

Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum

أبجد هوز حطي أبجد هوز حطي أبجد هوز حطي أبجد هوز حطي

Right-to-Left Languages Text alignment

Page 24: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Right-to-Left Languages Images

Page 25: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Right-to-Left Languages Resource images

For Resource images use asset catalogs

Specify dedicated images or mirror for RTL

Page 26: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

For server-side images, use layout direction media queries to load direction-specific assets

Right-to-Left Languages Remote images

<img srcset=“url1 (layout-direction:ltr), url2 (layout-direction:rtl)” ... />

NEW

Page 27: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

For server-side images, use layout direction media queries to load direction-specific assets

Right-to-Left Languages Remote images

<img srcset=“url1 (layout-direction:ltr), url2 (layout-direction:rtl)” ... />

NEW

Page 28: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

For server-side images, use layout direction media queries to load direction-specific assets

Right-to-Left Languages Remote images

<img srcset=“url1 (layout-direction:ltr), url2 (layout-direction:rtl)” ... />

NEW

Page 29: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

•Demo

Page 30: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Recap

Leading and trailing values for layout

Media queries for margin and padding

Natural text alignment

Alternate image assets as necessary

Test with RTL pseudolocalization language

Page 31: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Auto Layout with leading/trailing constraints

effectiveLayoutDirection when managing frames

Right-to-Left Languages Handling custom views

Internationalization Best Practices WWDC 2016

What's New in International User Interfaces WWDC 2016

Page 32: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Parry Panesar, tvOS Engineer

•Template Optimizations

Page 33: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data
Page 34: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

<grid>

Page 35: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

<lockup>

Page 36: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

<title>

<img>

Page 37: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data
Page 38: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Scalability IssuesTi

me

Number of Items

Page 39: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Scalability Issues

Parsing overhead • Data to DOM • DOM to views

Page 40: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Scalability Issues

Parsing overhead • Data to DOM • DOM to views

Large memory footprint

Page 41: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations

Prototypes and Data Binding

Pagination

NEW

Page 42: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations

{ “objects” : [

{ “url” : “url1”, “title” : “Title 1”

},

{ “url” : “url2”, “title” : “Title 2”

},

.

.

.

. ]

}

<grid>

</grid>

Data Template

JavaScript XML

</section>

<section>

Page 43: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

{ “objects” : [

{ “url” : “url1”, “title” : “Title 1”

},

{ “url” : “url2”, “title” : “Title 2”

},

.

.

.

. ]

}

Template Optimizations

</section>

<grid>

</grid>

JavaScript XML

Data Template

<section>

Page 44: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

{ “objects” : [

{ “url” : “url1”, “title” : “Title 1”

},

{ “url” : “url2”, “title” : “Title 2”

},

.

.

.

. ]

}

Template Optimizations

</section>

<grid>

</grid>

JavaScript XML

<lockup> <img src=“url2” width=“308” height=“308”/> <title>Title 2</title>

</lockup>

<lockup> <img src=“url1” width=“308” height=“308”/> <title>Title 1</title>

</lockup>

.

.

.

.

Data Template

<section>

Page 45: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations

</section>

<grid>

</grid>

Template

XML

<lockup> <img src=“url2” width=“308” height=“308”/> <title>Title 2</title>

</lockup>

<lockup> <img src=“url1” width=“308” height=“308”/> <title>Title 1</title>

</lockup>

.

.

.

.

<section>

Page 46: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations

</section>

<grid>

</grid>

Template

XML

<lockup> <img src=“url2” width=“308” height=“308”/> <title>Title 2</title>

</lockup>

<lockup> <img src=“url1” width=“308” height=“308”/> <title>Title 1</title>

</lockup>

.

.

.

.

<section>

Page 47: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

<section>

</section>

<grid>

</grid>

Template

<lockup> <img width=“308” height=“308”/> <title></title>

</lockup>

.

.

.

.

Template OptimizationsXML

<lockup> <img width=“308” height=“308”/> <title></title>

</lockup>

Page 48: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

<section>

</section>

<grid>

</grid>

Template

<lockup> <img width=“308” height=“308”/> <title></title>

</lockup>

.

.

.

.

Template OptimizationsXML

<lockup> <img width=“308” height=“308”/> <title></title>

</lockup>

Page 49: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations

Template

XML

</section>

<grid>

</grid>

<section>

<lockup> <img width=“308” height=“308”/> <title></title>

</lockup>

Page 50: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations

Template

XML

</section>

<prototypes>

</prototypes>

<grid>

</grid>

<section>

<lockup> <img width=“308” height=“308”/> <title></title>

</lockup>

Page 51: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations Prototype

Defines layout

Facilitates partial DOM authoring

Page 52: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations

{ “objects” : [

{ “url” : “url1”, “title” : “Title 1”

},

{ “url” : “url2”, “title” : “Title 2”

},

.

.

.

. ]

}

Data Template

JavaScript XML

</section>

<lockup> <img width=“308” height=“308”/> <title></title>

</lockup>

<prototypes>

</prototypes>

<grid>

</grid>

<section>

Page 53: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations

{ “objects” : [

{ “url” : “url1”, “title” : “Title 1”

},

{ “url” : “url2”, “title” : “Title 2”

},

.

.

.

. ]

}

Data Template

JavaScript XML

</section>

<section binding=“items : {objects};”>

<lockup> <img binding=“@src : {url};” width=“308” height=“308”/> <title binding=“textContent : {title};”></title>

</lockup>

<prototypes>

</prototypes>

<grid>

</grid>

Page 54: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations

{ “objects” : [

{ “url” : “url1”, “title” : “Title 1”

},

{ “url” : “url2”, “title” : “Title 2”

},

.

.

.

. ]

}

Data Template

JavaScript XML

<lockup> <img binding=“@src : {url};” width=“308” height=“308”/> <title binding=“textContent : {title};”></title>

</lockup>

<prototypes>

<grid>

</prototypes>

</grid>

<section binding=“items : {objects};”>

</section>

Page 55: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations

{ “objects” : [

{ “url” : “url1”, “title” : “Title 1”

},

{ “url” : “url2”, “title” : “Title 2”

},

.

.

.

. ]

}

Data Template

JavaScript XML

<lockup> <img binding=“@src : {url};” width=“308” height=“308”/> <title binding=“textContent : {title};”></title>

</lockup>

<prototypes>

<grid>

</prototypes>

</grid>

<section binding=“items : {objects};”>

</section>

Page 56: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations

{ “objects” : [

{ “url” : “url1”, “title” : “Title 1”

},

{ “url” : “url2”, “title” : “Title 2”

},

.

.

.

. ]

}

Data Template

JavaScript XML

<lockup> <img binding=“@src : {url};” width=“308” height=“308”/> <title binding=“textContent : {title};”></title>

</lockup>

<prototypes>

<grid>

</prototypes>

</grid></section>

<section binding=“items : {objects};”>

Page 57: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Associates data to element

Declared through binding attribute • @<attr> • textContent • items

Template Optimizations Data binding

Page 58: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations Data binding

Provide data using dataItem property

// Parse JSON text. let data = parseFromJSON(json);

// Attach data to section element. let section = document.createElement(“section”); section.dataItem = data;

Page 59: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations Data binding

Provide data using dataItem property

// Parse JSON text. let data = parseFromJSON(json);

// Attach data to section element. let section = document.createElement(“section”); section.dataItem = data;

Page 60: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations Data binding

Provide data using dataItem property

// Parse JSON text. let data = parseFromJSON(json);

// Attach data to section element. let section = document.createElement(“section”); section.dataItem = data;

Page 61: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations Data binding

Provide data using dataItem property

// Parse JSON text. let data = parseFromJSON(json);

// Attach data to section element. let section = document.createElement("section"); section.dataItem = data;

Page 62: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations Data binding

Provide data using dataItem property

// Parse JSON text. let data = parseFromJSON(json);

// Attach data to section element. let section = document.createElement("section"); section.dataItem = data;

Page 63: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Append using needsmore • shelf, grid, list, stackTemplate • Invoked towards the end

Template Optimizations Pagination

Page 64: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template Optimizations Pagination

Append using needsmore • shelf, grid, list, stackTemplate • Invoked towards the end

Requires observable objects

Page 65: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

// Map item objects into DataItem objects let dataItems = objects.map((object) => { let dataItem = new DataItem("MyObject", object.id); dataItem.url = object.url; dataItem.title = object.title; return dataItem; });

// Create a data item for the grid. let sectionDataItem = new DataItem(); sectionDataItem.objects = dataItems;

// Provide data through DOM let sectionElement = document.createElement("section"); sectionElement.dataItem = sectionDataItem;

Page 66: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

// Map item objects into DataItem objects let dataItems = objects.map((object) => { let dataItem = new DataItem("MyObject", object.id); dataItem.url = object.url; dataItem.title = object.title; return dataItem; });

// Create a data item for the grid. let sectionDataItem = new DataItem(); sectionDataItem.objects = dataItems;

// Provide data through DOM let sectionElement = document.createElement("section"); sectionElement.dataItem = sectionDataItem;

Page 67: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

// Map item objects into DataItem objects let dataItems = objects.map((object) => { let dataItem = new DataItem("MyObject", object.id); dataItem.url = object.url; dataItem.title = object.title; return dataItem; });

// Create a data item for the grid. let sectionDataItem = new DataItem(); sectionDataItem.objects = dataItems;

// Provide data through DOM let sectionElement = document.createElement("section"); sectionElement.dataItem = sectionDataItem;

Page 68: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

// Map item objects into DataItem objects let dataItems = objects.map((object) => { let dataItem = new DataItem("MyObject", object.id); dataItem.url = object.url; dataItem.title = object.title; return dataItem; });

// Create a data item for the grid. let sectionDataItem = new DataItem(); sectionDataItem.objects = dataItems;

// Provide data through DOM let sectionElement = document.createElement("section"); sectionElement.dataItem = sectionDataItem;

Page 69: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

// Map item objects into DataItem objects let dataItems = objects.map((object) => { let dataItem = new DataItem("MyObject", object.id); dataItem.url = object.url; dataItem.title = object.title; return dataItem; });

// Create a data item for the grid. let sectionDataItem = new DataItem(); sectionDataItem.objects = dataItems;

// Provide data through DOM let sectionElement = document.createElement("section"); sectionElement.dataItem = sectionDataItem;

Page 70: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

// Map item objects into DataItem objects let dataItems = objects.map((object) => { let dataItem = new DataItem("MyObject", object.id); dataItem.url = object.url; dataItem.title = object.title; return dataItem; });

// Create a data item for the grid. let sectionDataItem = new DataItem(); sectionDataItem.objects = dataItems;

// Provide data through DOM let sectionElement = document.createElement("section"); sectionElement.dataItem = sectionDataItem;

Page 71: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

// Map item objects into DataItem objects let dataItems = objects.map((object) => { let dataItem = new DataItem("MyObject", object.id); dataItem.url = object.url; dataItem.title = object.title; return dataItem; });

// Create a data item for the grid. let sectionDataItem = new DataItem(); sectionDataItem.objects = dataItems;

// Provide data through DOM let sectionElement = document.createElement("section"); sectionElement.dataItem = sectionDataItem;

Page 72: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

// needsmore event handler. stackTemplate.addEventListener("needsmore", (event) => { // Fetch next batch of items. fetchNextBatch((objects) => {

...

// Append to existing data items. Array.prototype.push.apply(sectionElement.dataItem.objects, dataItems); sectionElement.dataItem.touchPropertyPath("objects"); });

}

Page 73: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

// needsmore event handler. stackTemplate.addEventListener("needsmore", (event) => { // Fetch next batch of items. fetchNextBatch((objects) => {

...

// Append to existing data items. Array.prototype.push.apply(sectionElement.dataItem.objects, dataItems); sectionElement.dataItem.touchPropertyPath("objects"); });

}

Page 74: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

// needsmore event handler. stackTemplate.addEventListener(‘needsmore’, (event) => { // Fetch next batch of items. fetchNextBatch((objects) => {

...

// Append to existing data items. Array.prototype.push.apply(sectionElement.dataItem.objects, dataItems); sectionElement.dataItem.touchPropertyPath("objects"); });

}

Page 75: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

// needsmore event handler. stackTemplate.addEventListener(‘needsmore’, (event) => { // Fetch next batch of items. fetchNextBatch((objects) => {

...

// Append to existing data items. Array.prototype.push.apply(sectionElement.dataItem.objects, dataItems); sectionElement.dataItem.touchPropertyPath("objects"); });

}

Page 76: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

•Demo

Page 77: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Recap

Created template with prototypes

Specified data binding

Associated data to DOM

Implemented pagination

Page 78: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Template OptimizationsTi

me

Number of Items

Page 79: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Tim

e

Number of Items

Template Optimizations

Page 80: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Jeremy Foo, tvOS Engineer

•Development Using Web Inspector

Page 81: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data
Page 82: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data
Page 83: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Development Cycle

Speculative fixes

Page 84: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Development Cycle

Speculative fixes

Build-and-run cycle

Page 85: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Development Cycle

Speculative fixes

Build-and-run cycle

Loss of context

Page 86: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Web Inspector

Visual debugging

Network analysis

Local and Session storage

JavaScript debugging

Console logging

Performance analysis

Page 87: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Web Inspector

Visual debugging

Network analysis

Local and Session storage

JavaScript debugging

Console logging

Performance analysis

Please note I updated the “S” in JavaScript

Page 88: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Web Inspector

Visual debugging

Network analysis

Local and Session storage

JavaScript debugging

Console logging

Performance analysis

NEW

Page 89: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Visual DebuggingNEW

Page 90: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Visual Debugging Visualize elements

NEW

Page 91: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Visual Debugging Real-time DOM editing

Edit XML

NEW

Page 92: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Visual Debugging Real-time DOM editing

Edit XML

NEW

Page 93: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Edit XML

Reorder/delete nodes

Visual Debugging Real-time DOM editing

NEW

Page 94: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Edit XML

Reorder/delete nodes

Visual Debugging Real-time DOM editing

NEW

Page 95: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Edit XML

Reorder/delete nodes

Modify attributes

Visual Debugging Real-time DOM editing

NEW

Page 96: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Edit XML

Reorder/delete nodes

Modify attributes

Visual Debugging Real-time DOM editing

NEW

Page 97: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Edit XML

Reorder/delete nodes

Modify attributes

Copy XML

Visual Debugging Real-time DOM editing

NEW

Page 98: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Per node basis

Visual Debugging Inspect and modify styles

NEW

Page 99: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Per node basis

Visual Debugging Inspect and modify styles

NEW

Page 100: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Per node basis

Cascade ordering

Visual Debugging Inspect and modify styles

NEW

Page 101: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Per node basis

Cascade ordering

Media queries

Visual Debugging Inspect and modify styles

NEW

Page 102: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Visual Debugging Inspect and modify styles

Per node basis

Cascade ordering

Media queries

Default rules

NEW

Page 103: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Computed styles

NEWVisual Debugging Inspect and modify styles

Page 104: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Computed styles

NEWVisual Debugging Inspect and modify styles

Page 105: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Web Inspector Reload

NEW

Page 106: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

•Demo

Page 107: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Recap

Visualize elements

Real time editing

Reload

Page 108: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Network AnalysisNEW

Page 109: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Network AnalysisNEW

Per request timing information

Page 110: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Network AnalysisNEW

Per request timing information

Page 111: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Network AnalysisNEW

Per request timing information

Request properties

Page 112: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Network AnalysisNEW

Per request timing information

Request properties

Page 113: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Network Analysis

Per request timing information

Request properties

Headers

NEW

Page 114: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Network Analysis

Per request timing information

Request properties

Headers

NEW

Page 115: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

NEWLocal and Session Storage Inspection

Page 116: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

NEWLocal and Session Storage Inspection

Page 117: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

TVMLKit+

Page 118: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

TVMLKit+

Page 119: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Summary

Supports RTL for default templates

Use data binding/prototypes for large data sets

Web Inspector reduces development cycle

Page 120: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

More Informationhttps://developer.apple.com/wwdc17/202

Page 121: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Related Sessions

Localizing with Xcode 9 Tuesday 10:20AM

What’s new in tvOS Grand Ballroom B Wednesday 10:00AM

Focus Interaction in tvOS 11 Grand Ballroom A Thursday 9:00AM

Developing tvOS Apps Using TVMLKit: Part 1 WWDC2016

Developing tvOS Apps Using TVMLKit: Part 2 WWDC2016

Internationalization Best Practices WWDC2016

What's New in International User Interfaces WWDC2016

Page 122: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data

Labs

tvOS Lab Technology Lab I Tuesday 12:00-13:50

tvOS Lab Technology Lab H Wednesday 11:00-14:00

tvOS Lab Technology Lab I Thursday 11:00-13:00

Internationalization Lab Technology Lab I Tuesday 13:50-16:10

Internationalization Lab Technology Lab I Friday 9:00-11:00

Page 123: •Advances in TVMLKitdevstreaming-cdn.apple.com/videos/wwdc/...Data binding Provide data using dataItem property // Parse JSON text. let data = parseFromJSON(json); // Attach data