iOS specific layout using a UITableView, works only with simple children views

Introduced properties

protected fun cell_for_row_at_index_path(table_view: UITableView, index_path: NSIndexPath): UITableViewCell

ios :: TableView :: cell_for_row_at_index_path

Return a UITableViewCell for the item at index_path
init defaultinit(parent: nullable CompositeControl)

ios :: TableView :: defaultinit

protected fun native=(native: NATIVE)

ios :: TableView :: native=

protected fun number_of_rows_in_section(view: UITableView, section: Int): Int

ios :: TableView :: number_of_rows_in_section

Number of entries in section
protected fun number_of_sections_in_table_view(view: UITableView): Int

ios :: TableView :: number_of_sections_in_table_view

Number of sections in this view
protected fun title_for_header_in_section(view: UITableView, section: Int): NSString

ios :: TableView :: title_for_header_in_section

Title for section, return new NSString.nil for no title

Redefined properties

redef type NATIVE: UITableView

ios $ TableView :: NATIVE

Type of the native implementation of this control
redef type SELF: TableView

ios $ TableView :: SELF

Type of this instance, automatically specialized in every class
redef fun add(item: Control)

ios $ TableView :: add

Add item as a child of self
redef init init

ios $ TableView :: init

redef fun native: NATIVE

ios $ TableView :: native

Native implementation of this control

All properties

fun !=(other: nullable Object): Bool

core :: Object :: !=

Have self and other different values?
fun ==(other: nullable Object): Bool

core :: Object :: ==

Have self and other the same value?
type CLASS: Class[SELF]

core :: Object :: CLASS

The type of the class of self.
type NATIVE: JavaObject

app :: Control :: NATIVE

Type of native
type NATIVE: GtkWidget

app :: Control :: NATIVE

Type of native
type NATIVE: NSObject

app :: Control :: NATIVE

Type of the native implementation of this control
type SELF: Object

core :: Object :: SELF

Type of this instance, automatically specialized in every class
protected fun add(item: Control)

app :: CompositeControl :: add

Add item as a child of self
protected fun cell_for_row_at_index_path(table_view: UITableView, index_path: NSIndexPath): UITableViewCell

ios :: TableView :: cell_for_row_at_index_path

Return a UITableViewCell for the item at index_path
protected fun class_factory(name: String): CLASS

core :: Object :: class_factory

Implementation used by get_class to create the specific class.
fun class_name: String

core :: Object :: class_name

The class name of the object.
fun clear

app :: CompositeControl :: clear

Remove all items from self
init defaultinit(parent: nullable CompositeControl)

ios :: TableView :: defaultinit

init defaultinit(parent: nullable CompositeControl)

app :: Control :: defaultinit

fun finalize

core :: Finalizable :: finalize

Liberate any resources held by self before the memory holding self is freed
fun get_class: CLASS

core :: Object :: get_class

The meta-object representing the dynamic type of self.
fun has(item: Control): Bool

app :: CompositeControl :: has

Is item in self?
fun hash: Int

core :: Object :: hash

The hash code of the object.
init init

core :: Object :: init

fun inspect: String

core :: Object :: inspect

Developer readable representation of self.
protected fun inspect_head: String

core :: Object :: inspect_head

Return "CLASSNAME:#OBJECTID".
intern fun is_same_instance(other: nullable Object): Bool

core :: Object :: is_same_instance

Return true if self and other are the same instance (i.e. same identity).
fun is_same_serialized(other: nullable Object): Bool

core :: Object :: is_same_serialized

Is self the same as other in a serialization context?
intern fun is_same_type(other: Object): Bool

core :: Object :: is_same_type

Return true if self and other have the same dynamic type.
protected fun items: Array[Control]

app :: CompositeControl :: items

Child controls composing this control
protected fun items=(items: Array[Control])

app :: CompositeControl :: items=

Child controls composing this control
abstract fun native: NATIVE

app :: Control :: native

Native implementation of this control
abstract fun native: NATIVE

app :: Control :: native

The GTK element used to implement self
abstract fun native: NATIVE

app :: Control :: native

The Android element used to implement self
protected fun native=(native: NATIVE)

ios :: TableView :: native=

fun notify_observers(event: AppEvent)

app :: AppComponent :: notify_observers

Propagate event to all observers by calling AppObserver::on_event
protected fun number_of_rows_in_section(view: UITableView, section: Int): Int

ios :: TableView :: number_of_rows_in_section

Number of entries in section
protected fun number_of_sections_in_table_view(view: UITableView): Int

ios :: TableView :: number_of_sections_in_table_view

Number of sections in this view
intern fun object_id: Int

core :: Object :: object_id

An internal hash code for the object based on its identity.
fun observers: HashSet[AppObserver]

app :: AppComponent :: observers

All AppObserver notified of events raised by self
protected fun observers=(observers: HashSet[AppObserver])

app :: AppComponent :: observers=

All AppObserver notified of events raised by self
fun on_create

app :: AppComponent :: on_create

The application is being created
fun on_destroy

app :: AppComponent :: on_destroy

The application is being destroyed
fun on_event(event: AppEvent)

app :: AppObserver :: on_event

Notification of event raised by sender
fun on_pause

app :: AppComponent :: on_pause

The application leaves the active state but is still partially visible
fun on_restart

app :: AppComponent :: on_restart

The application returns to a visible state from a previous on_stop
fun on_restore_state

app :: AppComponent :: on_restore_state

The application is launching, restore its state from a previous on_save_state
fun on_resume

app :: AppComponent :: on_resume

The application enters the active state, it is in the foreground and interactive
fun on_save_state

app :: AppComponent :: on_save_state

The application may be destroyed soon, save its state for a future on_restore_state
fun on_start

app :: AppComponent :: on_start

The application is starting or restarting, it is visible to the user
fun on_stop

app :: AppComponent :: on_stop

The application is completely hidden from the user
fun output

core :: Object :: output

Display self on stdout (debug only).
intern fun output_class_name

core :: Object :: output_class_name

Display class name on stdout (debug only).
fun parent: nullable CompositeControl

app :: Control :: parent

Direct parent Control in the control tree
fun parent=(parent: nullable CompositeControl)

app :: Control :: parent=

Direct parent Control in the control tree
fun remove(item: Control)

app :: CompositeControl :: remove

Remove item from self
fun serialization_hash: Int

core :: Object :: serialization_hash

Hash value use for serialization
abstract fun signal(sender: GtkWidget, user_data: nullable Object)

gtk :: GtkCallable :: signal

return true to stop event processing, false to let it propagate
intern fun sys: Sys

core :: Object :: sys

Return the global sys object, the only instance of the Sys class.
protected fun title_for_header_in_section(view: UITableView, section: Int): NSString

ios :: TableView :: title_for_header_in_section

Title for section, return new NSString.nil for no title
abstract fun to_jvalue(env: JniEnv): JValue

core :: Object :: to_jvalue

fun to_s: String

core :: Object :: to_s

User readable representation of self.
package_diagram ios::TableView TableView app::CompositeControl CompositeControl ios::TableView->app::CompositeControl app::Control Control app::CompositeControl->app::Control ...app::Control ... ...app::Control->app::Control

Ancestors

abstract class AppComponent

app :: AppComponent

An element of an application that is notified of the application life cycle
interface AppObserver

app :: AppObserver

Observer of AppEvents raised by AppComponents
class Control

app :: Control

A control implementing the UI
class Finalizable

core :: Finalizable

An object needing finalization
interface GtkCallable

gtk :: GtkCallable

interface Object

core :: Object

The root of the class hierarchy.

Parents

class CompositeControl

app :: CompositeControl

A Control grouping other controls

Class definitions

ios $ TableView
# iOS specific layout using a `UITableView`, works only with simple children views
class TableView
	super CompositeControl

	redef type NATIVE: UITableView
	redef var native = new UITableView(new UITableViewStyle.plain)

	init
	do
		native.autoresizing_mask
		native.assign_delegate_and_data_source self
	end

	redef fun add(item)
	do
		# Adding a view to a UITableView is a bit tricky.
		#
		# Items are added to the Objective-C view only by callbacks.
		# We must store the sub views in local lists while waiting
		# for the callbacks.
		#
		# As usual, we keep the Nity object in `items`.
		# But we also keep their native counterparts in a list of
		# the `UITableViewAndDataSource` set as `native.delegate`.
		# Otherwise the native views could be freed by the Objective-C GC.

		# TODO use an adapter for the app.nit ListLayout closer to what exists
		# on both iOS and Android, to support large data sets.

		if item isa View then
			add_view_to_native_list(native, item.native)
		end

		super

		# Force redraw and trigger callbacks
		native.reload_data
	end

	private fun add_view_to_native_list(native: UITableView, item: UIView) in "ObjC" `{
		[((UITableViewAndDataSource*)native.delegate).views addObject:item];
	`}

	private fun get_view_from_native_list(native: UITableView, index: Int): UIView in "ObjC" `{
		return [((UITableViewAndDataSource*)native.delegate).views objectAtIndex:index];
	`}

	# Number of sections in this view
	#
	# By default, we assume that all `items` are in a single section,
	# so there is only one section.
	#
	# iOS callback: `numberOfSectionsInTableView`
	protected fun number_of_sections_in_table_view(view: UITableView): Int
	do return 1

	# Number of entries in `section`
	#
	# By default, we assume that all `items` are in a single section,
	# so no matter the section, this returns `items.length`.
	#
	# iOS callback: `numberOfRowsInSection`
	protected fun number_of_rows_in_section(view: UITableView, section: Int): Int
	do return items.length

	# Title for `section`, return `new NSString.nil` for no title
	#
	# By default, this returns no title.
	#
	# iOS callback: `titleForHeaderInSection`
	protected fun title_for_header_in_section(view: UITableView, section: Int): NSString
	do return new NSString.nil

	# Return a `UITableViewCell` for the item at `index_path`
	#
	# By default, we assume that all `items` are in a single section.
	# So no matter the depth of the `index_path`, this returns a cell with
	# the view at index part of `index_path`.
	#
	# iOS callback: `cellForRowAtIndexPath`
	protected fun cell_for_row_at_index_path(table_view: UITableView, index_path: NSIndexPath): UITableViewCell
	do
		var reuse_id = "NitCell".to_nsstring
		var cell = new UITableViewCell(reuse_id)

		# TODO if there is performance issues, reuse cells with
		# the following code, but clear the cell before use.

		#var cell = table_view.dequeue_reusable_cell_with_identifier(reuse_id)
		#if cell.address_is_null then cell = new UITableViewCell(reuse_id)

		var index = index_path.index_at_position(1)
		var view_native = get_view_from_native_list(table_view, index)
		var cv = cell.content_view
		cv.add_subview view_native

		return cell
	end
end
lib/ios/ui/ui.nit:498,1--596,3