Titanium JIRA Archive
Titanium SDK/CLI (TIMOB)

[TIMOB-9015] iOS: Tablerows' events are not returning the source

GitHub Issuen/a
TypeBug
PriorityHigh
StatusClosed
ResolutionInvalid
Resolution Date2012-05-07T12:40:14.000+0000
Affected Version/sRelease 2.1.0
Fix Version/sn/a
ComponentsiOS
LabelsSupportTeam, api, regression
ReporterMauro Parra-Miranda
AssigneeVishal Duggal
Created2012-05-07T09:48:42.000+0000
Updated2017-03-14T23:38:41.000+0000

Description

Problem description

When you add an event to the TableViewRow, you don't get the source of which tableviewrow was pressed. The customer wants to select/deselect a checkbox in a row, just with clicking on the row.

Actual Results

The event is not getting the source of the event.

Expected Results

The event behave the same as with 1.7.6

Test Case

1. Create a new mobile Project 2. Paste this:

	var fundListSize,fundCheckboxArray=[],fundsToPlotCount,grey=false,lightBlue=false,clickEvent=false,fundsSitemanagerMsg=null,rowCounter=0;
var win = createHistoricalFundGraphFundsWindow();
win.orientationModes = [Titanium.UI.LANDSCAPE_LEFT, Titanium.UI.LANDSCAPE_RIGHT];
win.open()

	/*
	 * Function to display the available funds that can be selected to display on the graph
	 */
	function createHistoricalFundGraphFundsWindow() {
	
			/* Declaring the variables*/
			var iOSTopTitle, planText, navTitleText, menuTitle, winLeftNavButton, winRightNavButton, winBackButtonTitle, winBackButtonTitleImage, winTabBarHidden, subHeader, tableViewDS, genericTableView, win;
			fundsSitemanagerMsg = ''//_response.historicalFundGraphFundMessage;
			fundsToPlotCount = 3;
			

			/* reset fundlistsize*/
			fundListSize = 0;

				tableViewDS = createHistoricalFundGraphFundsTableViewDS();
				genericTableView = Titanium.UI.createTableView({
			separatorColor:'#e7e7e7',
			data : tableViewDS,
			backgroundColor :'#e7e7e7'

		});
				genericTableView.top = 0;
				genericTableView.backgroundColor = '#e7e7e7';
				tableViewDS = null;
				
				var menuWindow = Titanium.UI.createWindow({
					barColor : '#929292',
					backgroundColor : '#E7E7E7'

				});
				menuWindow.add(genericTableView);
				
			
			
			

			return menuWindow;
	};
	/* Event invoked after clicking done button if the fund does not have any data */
	Ti.App.addEventListener('resetCheckBox', function(e) {
		for(var i=0;i<fundListSize;i++) {
			if (fundCheckboxArray[i].fundName === e.fundName && fundCheckboxArray[i].value) {
				fundCheckboxArray[i].off();
			}
		}
	});
	
	
	
	/*
	 * Function to create the data source to be added to the tableview that displays the funds
	 */
	function createHistoricalFundGraphFundsTableViewDS() {
			var responseLength=2;
			var datasource=[];
			var datasourceChecked=[];
					var fundRow,boxChecked;
					boxChecked=false;

					fundCheckboxArray.push(createHFGCheckBox('','xyz',boxChecked));
					fundCheckboxArray.push(createHFGCheckBox('','abc',boxChecked));
					fundRow=createHFGRowLndScpe({
						fFundName: 'xyz',
						sSwitch: fundCheckboxArray[0]
					});
					var fundRow1=createHFGRowLndScpe({
						fFundName: 'abc',
						sSwitch: fundCheckboxArray[1]
					});

					datasource.push(fundRow);
					datasource.push(fundRow1);
					fundListSize = 2;
			
			return datasource;
		
	};
	/*
	 * function to create checkbox ( a button masked as checkbox, not a switch ) for each row
	 */
	function createHFGCheckBox(_fundNum,_fundName,_checked) {

		var checkbox = Ti.UI.createButton({
			title:'',
			right:'5%',
			width:28,
			height:28,
			font: {
				fontSize: 25,
				fontWeight: 'bold'
			},
			value:_checked,
			fundNum:_fundNum,
			fundName:_fundName,
			checkColor:'none'
		});

		/* attach on/off actions */
		checkbox.on = function() {
			this.value = true;
		};
		checkbox.off = function() {
			this.value = false;

			
		};
		/* fire action to check or uncheck based on _checked bool param */
		if (_checked) {
			checkbox.on();
		} else {
			checkbox.off();
		}

		checkbox.addEventListener('click', function(e) {
			/* can always turn checkboxes off */
			alert(e)
		});
		return checkbox;
	};
	
	/*
	 * Function to create  row for fund label
	 */
	function createHFGRowLndScpe(_fundBalData) {
		if( typeof _fundBalData !== 'undefined' && _fundBalData !== null) {
			var _fundName = _fundBalData.fFundName;

			var row = Titanium.UI.createTableViewRow({
				backgroundColor : '#FFFFFF',
				selectedBackgroundColor : '#FFFFFF',
				selectionStyle : 'NONE'
			});
			var checkBoxView = Ti.UI.createView({
				right : 0,
				height : 30,
				width : '30%',
				uniqueRowId : rowCounter
			})
			row.addEventListener('click', function(e) {
				
				var id = e.source.uniqueRowId;
				if( typeof id !== 'undefined' && id !== null) {
					fundCheckboxArray[e.source.uniqueRowId].fireEvent('click');
				}
			});
			var fundNameLabel = Titanium.UI.createLabel({
				left : '5%',
				width : '65%',
				top : 15,
				bottom : 15,
				height : 'auto',
				color : '#363636',
				text : _fundName,
				font : {
					fontSize : 15,
					fontFamily : 'Helvetica Neue',
					fontWeight : 'bold'
				},
				uniqueRowId : rowCounter
			});
			rowCounter += 1;
			row.add(fundNameLabel);
			_fundName = null;
			checkBoxView.add(_fundBalData.sSwitch);
			row.add(checkBoxView);
			return row;
		}

	};
	

Extra info

This used to work properly in 1.7.6, but now in 2.1CI it's not working as before.

Comments

  1. Vishal Duggal 2012-05-07

    The source of the event is always available. Tested with current master and 2_0_X branch. The problem is the way the code is written. The click event handler for the tableView row can have 4 possible sources (button,label,row,checkBoxView). However the uniqueId is associated with only 2 elements(label,checkBoxView). So the if condition fails for 2 possible sources. From the way the code is written, the uniqueId is completely un-required since it simply is the row index which is always available via e.index. Also if you fire a click event to a child of the row from within the click event handler of the row, there is a very real possibility of causing a stack overflow and a crash. The way that CS has written the code is correct where the update of the button is done in a different method and not click. Attaching modified code that shows the source is always available and the right way to update the checkbox.
       var fundListSize,fundCheckboxArray=[],fundsToPlotCount,grey=false,lightBlue=false,clickEvent=false,fundsSitemanagerMsg=null;
       var win = createHistoricalFundGraphFundsWindow();
       win.orientationModes = [Titanium.UI.LANDSCAPE_LEFT, Titanium.UI.LANDSCAPE_RIGHT];
       win.open()
        
       /*
        * Function to display the available funds that can be selected to display on the graph
        */
       function createHistoricalFundGraphFundsWindow() {
       	/* Declaring the variables*/
       	var iOSTopTitle, planText, navTitleText, menuTitle, winLeftNavButton, winRightNavButton, winBackButtonTitle, winBackButtonTitleImage, winTabBarHidden, subHeader, tableViewDS, genericTableView, win;
       	fundsSitemanagerMsg = ''//_response.historicalFundGraphFundMessage;
       	fundsToPlotCount = 3;
       
           /* reset fundlistsize*/
       	fundListSize = 0;
        
       	tableViewDS = createHistoricalFundGraphFundsTableViewDS();
       	genericTableView = Titanium.UI.createTableView({
       		separatorColor:'#e7e7e7',
       		data : tableViewDS,
       		backgroundColor :'#e7e7e7'
       	});
           
       	genericTableView.top = 0;
       	genericTableView.backgroundColor = '#e7e7e7';
       	tableViewDS = null;
                        
       	var menuWindow = Titanium.UI.createWindow({
       		barColor : '#929292',
       		backgroundColor : '#E7E7E7'
       	});
           
       	menuWindow.add(genericTableView);
       	return menuWindow;
       };
        
       /*
        * Function to create the data source to be added to the tableview that displays the funds
        */
       function createHistoricalFundGraphFundsTableViewDS() {
       	var responseLength=2;
       	var datasource=[];
       	var datasourceChecked=[];
       	var fundRow,boxChecked;
       	boxChecked=false;
       	fundCheckboxArray.push(createHFGCheckBox('','xyz',boxChecked));
       	fundCheckboxArray.push(createHFGCheckBox('','abc',boxChecked));
       	fundRow=createHFGRowLndScpe({
       		fFundName: 'xyz',
       		sSwitch: fundCheckboxArray[0]
       	});
       	var fundRow1=createHFGRowLndScpe({
       		fFundName: 'abc',
       		sSwitch: fundCheckboxArray[1]
       	});
       
       	datasource.push(fundRow);
       	datasource.push(fundRow1);
       	fundListSize = 2;
       	return datasource;
       };
       /*
        * function to create checkbox ( a button masked as checkbox, not a switch ) for each row
        */
       function createHFGCheckBox(_fundNum,_fundName,_checked) {
        
       	var checkbox = Ti.UI.createButton({
       		title:'',
       		right:'5%',
       		width:28,
       		height:28,
       		font: {
       			fontSize: 14,
       			fontWeight: 'bold'
       		},
       		value:_checked,
       		fundNum:_fundNum,
       		fundName:_fundName,
       		checkColor:'none'
       	});
       
       	/* attach on/off actions */
       	checkbox.on = function() {
       		this.value = true;
       		this.title='ON';
       	};
       	checkbox.off = function() {
       		this.value = false;
       		this.title='OFF';
       	};
        
       	/* fire action to check or uncheck based on _checked bool param */
       	if (_checked) {
       		checkbox.on();
       	} else {
       		checkbox.off();
       	}
        
       	checkbox.addEventListener('updateCheckBox', function(e) {
       		/* can always turn checkboxes off */
       		if(e.source.value == true)
       		{
       			checkbox.off();
       		}
       		else
       		{
       			checkbox.on();
       		}
       	});
       	return checkbox;
       };
            
       /*
        * Function to create  row for fund label
        */
       function createHFGRowLndScpe(_fundBalData) {
       	if( typeof _fundBalData !== 'undefined' && _fundBalData !== null) {
       		var _fundName = _fundBalData.fFundName;
       		var row = Titanium.UI.createTableViewRow({
       			backgroundColor : '#FFFFFF',
       			selectedBackgroundColor : '#FFFFFF',
       			selectionStyle : 'NONE'
       		});
       		var checkBoxView = Ti.UI.createView({
       			right : 0,
       			height : 30,
       			width : '30%',
       		})
       		row.addEventListener('click', function(e) {
       			var id = e.index;
       			Ti.API.info('Row got click Source: '+e.source+' Row Index:'+e.index);
       			if( typeof id !== 'undefined' && id !== null) {
       				fundCheckboxArray[id].fireEvent('updateCheckBox');
           		}
       		});
       		var fundNameLabel = Titanium.UI.createLabel({
       			left : '5%',
       			width : '65%',
       			top : 15,
       			bottom : 15,
       			height : 'auto',
       			color : '#363636',
       			text : _fundName,
       			font : {
       				fontSize : 15,
       				fontFamily : 'Helvetica Neue',
       				fontWeight : 'bold'
       			},
       		});
       		row.add(fundNameLabel);
       		_fundName = null;
       		checkBoxView.add(_fundBalData.sSwitch);
       		row.add(checkBoxView);
       		return row;
       	}
       };
       
  2. Lee Morris 2017-03-14

    Closing ticket as invalid.

JSON Source